
使用 sed (GNU sed) 4.2.2,我想:
- 匹配
Line1
- 檢查
Line2
下面Line1
是否等於String
- 如果沒有 -
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
另一個換行符。