Replace 如何在匹配(每)两个空行后替换下一个字符串?

Replace 如何在匹配(每)两个空行后替换下一个字符串?,replace,awk,blank-line,Replace,Awk,Blank Line,有没有办法在Awk、sed……中进行这种替换 我有一个文本文件,其中的部分被分成两个空行 section1_name_x dklfjsdklfjsldfjsl section2_name_x dlskfjsdklfjsldkjflkj section_name_X dfsdjfksdfsdf 我想用section\u name\u x替换每个section\u name\u x,这就是,如何在匹配每两个空行后替换下一个字符串 谢谢 史蒂夫,嗯 给出了

有没有办法在Awk、sed……中进行这种替换

我有一个文本文件,其中的部分被分成两个空行

   section1_name_x
   dklfjsdklfjsldfjsl


   section2_name_x
   dlskfjsdklfjsldkjflkj


   section_name_X
   dfsdjfksdfsdf
我想用section\u name\u x替换每个section\u name\u x,这就是,如何在匹配每两个空行后替换下一个字符串

谢谢

史蒂夫,

给出了你的示例数据,为什么不

sed 's/^section[0-9]*_name.*/#/' file > newFile && mv newFile file
一些sed支持sed-i或sed-i覆盖现有文件,避免了&&mv。。。如上所示

reg ex表示,节必须位于行的开头,并且可以选择包含数字或根本不包含数字

给出了你的示例数据,为什么不

sed 's/^section[0-9]*_name.*/#/' file > newFile && mv newFile file
一些sed支持sed-i或sed-i覆盖现有文件,避免了&&mv。。。如上所示

reg ex表示,节必须位于行的开头,并且可以选择包含数字或根本不包含数字

IHTH

在gawk中,您可以使用RT内置变量:

gawk '{$1="#"$1; print $0 RT}' RS='\n\n' file
*更新*

多亏了@EdMorton,我意识到我的第一个版本是错误的。 发生了什么:

分配给$1会导致重新生成记录,这在这种情况下是不好的,因为任何空格序列都会被字段之间的单个空格以及记录开头和结尾的空字符串替换。 使用“打印”会在输出中添加额外的换行符。 正确版本:

gawk '{printf "%s", "#" $0 RT}' RS='\n\n\n' file
在gawk中,可以使用RT内置变量:

gawk '{$1="#"$1; print $0 RT}' RS='\n\n' file
*更新*

多亏了@EdMorton,我意识到我的第一个版本是错误的。 发生了什么:

分配给$1会导致重新生成记录,这在这种情况下是不好的,因为任何空格序列都会被字段之间的单个空格以及记录开头和结尾的空字符串替换。 使用“打印”会在输出中添加额外的换行符。 正确版本:

gawk '{printf "%s", "#" $0 RT}' RS='\n\n\n' file

请注意,这将用单个空格替换节名称中的所有空格链。为什么不干脆“{print$0 RT}”?此外,脚本没有查找2个空行,只有1个,因为第一个\n位于非空行的末尾。您需要使用RS='\n\n\n',然后设置ORS=或使用printf而不是print作为输出。@EdMorton谢谢您的评论。我完全同意你的第一个评论。分配给$1会占用每个字段周围的空间,所以这不是我打算做的。。但是,我测试了您的第二个注释,关于RS='\n\n'或RS='\n\n',文件中有三个新行字符是正确的,但其中一个似乎被FS吃掉了,因此RS='\n\n'实际上可以工作..不,它似乎可以工作,因为它匹配前2个\n,然后将第3个\n作为下一条记录的开始,然后分配给$1会导致记录重新编译删除前导空格。这是两个相互隐藏的bug的组合。使用记录之间只有一个空行而不是两个空行的输入进行尝试,您会发现脚本错误地认为只有一个空行是可接受的RS。是的,这样就可以了。我会将它写成printf%s%s,$0,RT,但任何一种方法都可以。请注意,这将用一个空格替换节名中的所有空格链。为什么不干脆“{print$0 RT}”?此外,脚本没有查找2个空行,只有1个,因为第一个\n位于非空行的末尾。您需要使用RS='\n\n\n',然后设置ORS=或使用printf而不是print作为输出。@EdMorton谢谢您的评论。我完全同意你的第一个评论。分配给$1会占用每个字段周围的空间,所以这不是我打算做的。。但是,我测试了您的第二个注释,关于RS='\n\n'或RS='\n\n',文件中有三个新行字符是正确的,但其中一个似乎被FS吃掉了,因此RS='\n\n'实际上可以工作..不,它似乎可以工作,因为它匹配前2个\n,然后将第3个\n作为下一条记录的开始,然后分配给$1会导致记录重新编译删除前导空格。这是两个相互隐藏的bug的组合。使用记录之间只有一个空行而不是两个空行的输入进行尝试,您会发现脚本错误地认为只有一个空行是可接受的RS。是的,这样就可以了。我会把它写成printf%s%s,$0,RT,但任何一种方法都可以。