3

我想操作一个文本文件,这样缩进的行块将用 {{{ 和 }}} 括起来。

这就是我卡住的地方:

  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

如果有人花时间在这里为我指明正确的方向,我将不胜感激。谢谢,

4

1 回答 1

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
于 2013-09-10T17:02:42.647 回答