sed插入/追加和打印图案空间

时间:2013-09-10 16:36:58

标签: sed

我想操纵一个文本文件,以便用{{{和}}}包围缩进行的块。

这就是我被困住的地方:

  1 /^\ [^\ ]/,/^[^\ ]/{        # match range: all indented plus line after that
  2    b fixIndented            # branch
  3 }
  4 
  5 /^[^\ ]/{p;b}               # print all non-indented outside range and exit.
  6                             
  7 :fixIndented
  8 /^[^\ ]/{                   # match last line of range
  9    x;                       # swap Holdbuffer und patternSpace, edit patternSpace
 10    i\
 11       {{{
 12    a\
 13       }}}
 14    p;
 15    x;p;
 16 }
 17 H;                          # write each line in range into holdBuffer

我认为第15行应该在保持缓冲区中读取(包含我在第9行中交换的内容)然后打印它,操作的模式空间(第10-13行)打印之后( 14)。 但这不会发生。相反,它似乎将保持缓冲区中的行合并到模式空间中。像这样:

bla
blubb
 foo1
 bla2
 foo3
sadgfasdf
bar
foo

变为:

bla
blubb
      {{{

 foo1
 bla2
 foo3
sadgfasdf
      }}}   
bar
foo

如果有人花时间指引我走向正确的方向,我将非常感激。谢谢,

1 个答案:

答案 0 :(得分:2)

也可以使用sed但是使用awk很简单:

cat file
bla
blubb
 foo1
 bla2
 foo3
sadgfasdf
bar
foo

awk '!s && /^ /{s=1; $0 = " {{{" ORS $0} s && /^[^ ]/{s=0; $0 = " }}}" ORS $0}1' file
bla
blubb
 {{{
 foo1
 bla2
 foo3
 }}}
sadgfasdf
bar
foo