我有一个字符串
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/