在匹配模式的每一行之前插入换行符,除非前一行已经是空的

Cra*_*ram 6 sed text-processing

我需要在包含模式的任何行之前添加一个新行,我们可以假设该模式始终是当前行的第一个字符串。例如

This is a
pattern
This is a
pattern
Run Code Online (Sandbox Code Playgroud)

我可以用sed命令添加一个新行

sed -i 's/pattern\+/\n&/g' file
Run Code Online (Sandbox Code Playgroud)

得到输出

This is a

pattern
This is a

pattern
Run Code Online (Sandbox Code Playgroud)

为了防止添加多个新行(在多次执行的情况下),我想检查模式之前的行是否为空。我知道我可以做到这一点

if [ "$line" == "" ]; then
Run Code Online (Sandbox Code Playgroud)

但是,我首先如何确定匹配模式的前一行?

编辑:模式可以发生多次。

Sté*_*las 6

您可以将前一行存储在保留空间中:

sed '
 /^pattern/{
   x
   /./ {
     x
     s/^/\
/
     x
   }
   x
 }
 h'
Run Code Online (Sandbox Code Playgroud)

但是,它会更清晰awk

awk '!previous_empty && /pattern/ {print ""}
     {previous_empty = $0 == ""; print}'
Run Code Online (Sandbox Code Playgroud)

就像 GNU 实现sed有一个-i就地编辑选项一样,awkas的 GNU 实现也是-i inplace如此。