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'

但它返回:

Line1
字串
Line2
字串
Line3

我也嘗試過:

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/{...}

    僅噹噹前行與 regex 匹配時才執行大括號中的命令Line1

  • N

    這將讀取下一行並將其附加到當前行,兩行之間用換行符號分隔。

  • /\nString$/b

    如果第二行與正規表示式匹配\nString$,則跳過其餘命令(“branch”,b)。

  • s/\n/\nString\n/

    這會將分隔第一行和第二行的換行符替換為換行符,後面接著String另一個換行符。

相關內容