bash - 应用替换 N 次

标签 bash sed

我有一个字符串

data1_data2_data3_data4@data5,data6

碰巧,有时候,data5中包含下划线,恰好是字段分隔符。丑陋,我知道。

我想用类似这样的方式读取这些数据片段:

IFS="_@," read d1 d2 d3 d4 d5 d6 <<< "$input"

当 data5 包含下划线时,问题就来了。要变通解决此问题。我想用逗号(和 @ )替换前三个下划线。到目前为止我发现的简单方法是使用 sed:

sed 's/_/,/; s/_/,/; s/_/,/; s/@/,/' <<< "$input"

但是重复三次相同的替换似乎效率很低。如果我需要重复 5000 次会怎样?

有什么方法可以告诉 sed 将替换重复一定次数吗?

为了完整,示例输入:

input="data1_data2_data3_data4@d_a_t_a_5,data6"
IFS="," read d1 d2 d3 d4 d5 d6 <<< "$input"

预期输出:

d1=="data1"
d2=="data2"
d3=="data3"
d4=="data4"
d5=="d_a_t_a_5"
d6=="data6"

最佳答案

您可以在进程替换中使用此 awk:

input="data1_data2_data3_data4@d_a_t_a_5,data6"

IFS=, read d1 d2 d3 d4 d5 d6 < <(awk -F@ -v OFS=, -v n=3 '{
while (i++<n) sub(/_/, ",", $1)} 1' <<< "$input")

# check variable values
declare -p d1 d2 d3 d4 d5 d6

declare -- d1="data1"
declare -- d2="data2"
declare -- d3="data3"
declare -- d4="data4"
declare -- d5="d_a_t_a_5"
declare -- d6="data6"
  • awk 命令使用 @ 作为字段分隔符。
  • awk 命令将_ 替换为 仅在第一个字段 并且完全 n 次。

关于bash - 应用替换 N 次,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53817080/

相关文章:

linux - grep 变量和空格的问题

bash - SASS:捕获语法错误

shell - 将列名替换为文件名 shell 脚本

regex - 删除两个特殊字符之间的字符

python - 替换/删除 Bash 中其他两行之间的行

bash - 如何使用 bash 命令强制取消 dockerbuild?

bash - 用于创建链接的脚本

linux - 如何使用Linux命令跳过字符串开头和结尾的表达式

linux - 匹配两个或模式并交换所有模式的文本

regex - 如何在 Linux 中将正则表达式传递给 find 命令?