不知道爲什麼我的RedGex表達不工作,我想ommit匹配和下一行SED刪除匹配和下一行
[example.com]
10.0.0.1
10.0.0.2
[example.net]
10.0.0.10
10.0.0.20
所需的輸出
[example.net]
10.0.0.10
10.0.0.20
這是我曾嘗試到目前爲止,但它匹配比想望更多的線
sed -e '/(\[example.com\])(.*\n)+/d'
不知道爲什麼我的RedGex表達不工作,我想ommit匹配和下一行SED刪除匹配和下一行
[example.com]
10.0.0.1
10.0.0.2
[example.net]
10.0.0.10
10.0.0.20
所需的輸出
[example.net]
10.0.0.10
10.0.0.20
這是我曾嘗試到目前爲止,但它匹配比想望更多的線
sed -e '/(\[example.com\])(.*\n)+/d'
sed是針對個別行的簡單替代,就是這樣。爲別的,你應該用awk對於軟件的每個所需的特性(效率,透明度,穩健性,可移植性,可維護性等,等):
$ awk '/^\[/{f=/\[example\.com\]/} f' file
[example.com]
10.0.0.1
10.0.0.2
$ awk '/^\[/{f=/\[example\.com\]/} !f' file
[example.net]
10.0.0.10
10.0.0.20
謝謝埃德,非常清楚! – Deano
我認爲awk
更適合於此任務
$ awk '/\[example.com\]/{f=1; next} /\[example.*\]/{f=0} !f' ip.txt
[example.net]
10.0.0.10
10.0.0.20
/\[example.com\]/{f=1; next}
如果線匹配[example.com]
設置一個標誌f
並移動到下一行/\[example.*\]/{f=0}
如果線匹配\[example.*\]
,未設置該標誌!f
打印行,如果標誌沒有被設置
使用sed
,b美國東部時間我可以使用此answer
$ sed '/\[example.com\]/,/\[example.*\]/ { /\[example.com\]/d; /\[example.*\]/!d }' ip.txt
[example.net]
10.0.0.10
10.0.0.20
我從你的例子中學到了很多東西,非常感謝! – Deano
這可能爲你工作(GNU SED)做:
sed -n '/^\[[^]*\]/h;G;/\n\[example.com\]/!P;d' file
在遇到一個線(S)你不要想匹配,店內說行在保持空間(HS)中,將其附加到圖案空間(PS),並且如果第二部分不包含所需的字符串,則只打印當前行。
的行數相匹配後刪除'[例如.com]'固定或可變? – Sundeep
行數是可變的:) – Deano
所以,你想從行匹配中刪除'[example.com]'但不包括匹配下一行'[example。*]'? – Sundeep