1

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

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

   section1_name_x
   dklfjsdklfjsldfjsl


   section2_name_x
   dlskfjsdklfjsldkjflkj


   section_name_X
   dfsdjfksdfsdf

我想用“#section_name_x”替换每个“section_name_x”,也就是说,如何在匹配(每)两个空行之后替换下一个字符串?

谢谢,

史蒂夫,

4

3 回答 3

2
awk '
    (NR==1 || blank==2) && $1 ~ /^section/ {sub(/section/, "#&")}
    { 
        print
        if (length) 
            blank = 0
        else
            blank ++
    }
' file
   #section1_name_x
   dklfjsdklfjsldfjsl


   #section2_name_x
   dlskfjsdklfjsldkjflkj


   #section_name_X
   dfsdjfksdfsdf
于 2013-12-28T14:22:09.927 回答
1

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

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

* 更新 *

感谢@EdMorton,我意识到我的第一个版本不正确。怎么了:

  • 分配给$1会导致记录被重建,这在这种情况下不好,因为任何空格序列都被字段之间的单个空格以及记录开头和结尾的空字符串替换。
  • Usingprint在输出中添加了一个额外的换行符。

正确的版本:

gawk '{printf "%s", "#" $0 RT}' RS='\n\n\n' file
于 2013-12-28T13:17:38.570 回答
1

嗯……

鉴于您的示例数据,为什么不只是

sed 's/^section[0-9]*_name.*/#/' file > newFile && mv newFile file

一些 seds 支持sed -iORsed -i""覆盖现有文件,避免&& mv ...上面显示的情况。

reg ex 说,section 必须在行的开头,并且可以选择包含一个数字或 NO 数字。

IHTH

于 2013-12-28T13:03:29.553 回答