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)
但是,我首先如何确定匹配模式的前一行?
编辑:模式可以发生多次。
您可以将前一行存储在保留空间中:
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
就地编辑选项一样,awk
as的 GNU 实现也是-i inplace
如此。