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

Unix Sed/Awk:如何在一行中插入系列模式中的文本,unix,awk,sed,Unix,Awk,Sed,需要在以下行中的任意两个顺序逗号之间插入“\N”: "abc,,,,5,,,3.2,," 致: 此外,逗号的序号不是固定的,可能是6、7或更多。需要一种灵活的方式来处理它 没有从google中找到明确的解决方案。您可以使用以下sed命令: 演示: 说明: s/、/、\\N、/g将在字符串上全局替换、、、、、\N,但是您必须在模式空间上执行两次传递,以确保所有替换都在给出以下命令时发生:s/、/、\\N、/g;s/,/,\\N,/g 补充说明: 为了回答您对这种方法不灵活的疑问,我准备了以下输入

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

"abc,,,,5,,,3.2,,"
致:

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


没有从google中找到明确的解决方案。

您可以使用以下sed命令:

演示:

说明:

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,

你能试一下吗

awk '{gsub(/\,\,/,",\\N,");gsub(/\,\,/,",\\N,")} 1' Input_file
使用perl:


谢谢你的快速回复。问题是,顺序逗号的数量不仅仅是3或4,可能更多。有没有更灵活的方法来适应它?更清楚地更新了我的问题。@sleepy:当前的方法是灵活的,输入文件中可以有尽可能多的连续逗号。他们将被正确处理@sleepy:你检查过sed命令的灵活性了吗?我还添加了一个awk命令。我刚试过,你是对的。谢谢你的额外解释。似乎删除了一些逗号。请检查以下输出:$echo test,,,,mmm,,,,aa,,,awk'{gsub/\,\,/,\\N,;gsub/\,\,/,}1'输出:test,,,N,mmm,,,N,aa,,,Sleepy是对的,你应该试试:$echo test,,,,mmm,,,,,,aa,,,,awk'{gsub/\,,,,,,,,,,,,,,,,,,,,,,,,,,,,N,;gsub/,谢谢老兄让我知道。@RavinderSingh13:回答得很好,老兄+1 ;- ;-
$ 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,
$ 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
perl -pe '1 while s/,,/,\\N,/g'