sed,仅当匹配项不存在时才添加行

sed,仅当匹配项不存在时才添加行

使用 sed (GNU sed) 4.2.2,我想要:

  1. 匹配Line1
  2. 检查Line2下面Line1是否等于String
  3. 如果没有 - 追加到String后面Line1(或者插入到前面Line2

我尝试过的:

echo -e "Line1\nLine2\nLine3" | sed '/Line1/n;/^String$/!iString'

但它返回:

行 1
字符串 行
2
字符串
行 3

我也尝试过:

echo -e "Line1\nLine2\nLine3" | sed '/Line1/{n;/^String$/!iString}'

但它又回来了

sed:-e 表达式 #1,字符 0:不匹配“{”

我知道如何用另一种方式做到这一点,也使用 sed,但我试图了解如何以上面描述的确切方式实现它。另外,请告诉我我的代码有什么问题。

答案1

尝试:

sed '/Line1/{N; /\nString$/b; s/\n/\nString\n/}' file

局限性: 如果Line1连续出现两行,这可能会或可能不会实现您想要的效果。

例子

让我们考虑这个测试文件:

$ cat file
Line1
String
Line2
String
Line3
Line1
Line2

现在,让我们应用命令:

$ sed '/Line1/{N; /\nString$/b; s/\n/\nString\n/}' file
Line1
String
Line2
String
Line3
Line1
String
Line2

怎么运行的

  • Line1/{...}

    仅当当前行与正则表达式匹配时,才会执行花括号中的命令Line1

  • N

    这将读入下一行并将其附加到当前行,两行之间用换行符分隔。

  • /\nString$/b

    如果第二行与正则表达式匹配\nString$,则跳过其余命令(“branch”,b)。

  • s/\n/\nString\n/

    这会将第一行和第二行之间的换行符替换为一个换行符加String另一个换行符。

相关内容