sed/awk:如何以系列模式插入文本



需要在按下2个序列逗号之间插入' n',如下所示:

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

to:

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

另外,后果逗号的数量不是固定的,也许是6、7或更多。需要一种灵活的方法来处理它。

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

您只需使用以下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将在字符串上全球替换,,替换CC_3,但是您将在模式空间上进行两次通过,以确保所有替换都发生了,请给出命令: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,可以以相同的方式实现2个通过中的类似方法:

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

您可以尝试一次。

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

with perl

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

最新更新