Sed / Awk:如何在一行中的系列模式中插入文本

时间:2019-05-23 01:33:19

标签: unix awk sed

需要在下面一行中的任意2个顺序逗号之间插入“ \ N”:

"abc,,,,5,,,3.2,,"

收件人:

"abc,\N,\N,\N,5,\N,\N,3.2,\N,"

此外,结果逗号的数量不是固定的,可能是6、7或更多。需要一种灵活的方式来处理它。

找不到来自Google的明确解决方案。

3 个答案:

答案 0 :(得分:3)

您可以只使用以下sed命令:

sed 's/,,/,\\N,/g;s/,,/,\\N,/g;'

演示:

$ echo 'abc,,,,5,,,3.2,,' | sed 's/,,/,\\N,/g;s/,,/,\\N,/g;s/,,/,\\N,/g'
abc,\N,\N,\N,5,\N,\N,3.2,\N,

说明:

s/,,/,\\N,/g会在字符串上全局地将,,替换为,\N,,但是您必须在模式空间上进行两次遍历,以确保在给定命令的情况下进行了所有替换:s/,,/,\\N,/g;s/,,/,\\N,/g;

其他说明:

为回答您对这种方法不灵活的疑问,我准备了以下输入文件。

$ cat input_comma.txt 
abc,,,,5,,,3.2,,
,,,,,,def,
1,,,,,,1.2
6commas,,,,,,
7commas,,,,,,,

如您所见,输入中出现多少个连续逗号并不重要:

$ sed 's/,,/,\\N,/g;s/,,/,\\N,/g;s/,,/,\\N,/g' input_comma.txt 
abc,\N,\N,\N,5,\N,\N,3.2,\N,
,\N,\N,\N,\N,\N,def,
1,\N,\N,\N,\N,\N,1.2
6commas,\N,\N,\N,\N,\N,
7commas,\N,\N,\N,\N,\N,\N,

使用awk,可以以相同的方式在两遍中实现类似的方法:

$ echo "test,,,mmm,,,,aa,," | awk '{gsub(/\,\,/,",\\N,");gsub(/\,\,/,",\\N,")} 1'
test,\N,\N,mmm,\N,\N,\N,aa,\N,

答案 1 :(得分:3)

请您尝试一次。

awk '{gsub(/\,\,/,",\\N,");gsub(/\,\,/,",\\N,")} 1' Input_file

答案 2 :(得分:1)

使用perl

perl -pe '1 while s/,,/,\\N,/g'