使用 sed 刪除第一行之後具有匹配模式的行

使用 sed 刪除第一行之後具有匹配模式的行

我想刪除第一行之後包含模式的每一行(模式是/^country\t/)。我可以刪除每一個出現與sed '/^country\t/d' in.txt > out.txt,但我想將第一次出現保留在第一行。

背景是我有一個帶有標題的製表符分隔文件的目錄,並且我將這些文件與cat.我想刪除多餘的標題。

在 Vim 中我可以做類似的事情: 2,$g/^country\t/d,但我無法找出 sed 解決方案。當我嘗試時sed '2,$ /^country\t/d in.txt > out.txt出現錯誤unknown command: /

謝謝!

答案1

沒有直接的方法,但這是一個解決方法:

sed -e '1,2 s/^country\t/NOCHANGE/' -e '/^country\t/d' -e 's/NOCHANGE/country/'  in.txt > out.txt

答案2

這可能對你有用:

sed '1b;/^country\t/d' in.txt > out.txt

或者

sed '1!{/^country\t/d}' in.txt > out.txt

答案3

sed '/pattern/{x;/pattern/!{x;h;b;};x;d}' file

這將刪除第一個符合行之後的每個符合行。評論:

/圖案/- 匹配模式

{X- 如果上面匹配,則交換模式並保持緩衝區

;/模式/!{x;h;b;}- 現在測試模式緩衝區(它現在在第一次匹配時將為空),如果沒有!已經包含模式,然後將模式「x」交換並再次保留緩衝區,然後將模式緩衝區複製到保留緩衝區「h」中,並將「b」分支到腳本末尾,然後載入下一行。

;x;d}- 僅當上一個步驟中的否定模式匹配失敗時才會執行該位元 - 即模式緩衝區與您的模式匹配。在這種情況下,再次將保持和模式緩衝區交換回“x”,並刪除“d”行。

答案4

如果 /pattern/ 不符合空白行,則使用「空格hold初始化為空白行」來測試第一個符合項目:

保留第一行:

sed '/pattern/ {x; /^$/!d; g;}' file

刪除第一行:

sed '/pattern/ x' file

只編輯第一行:

sed '/pattern/ {x; /^$/!b'$'\n'' g; s/pattern/xx/; }' file

僅編輯以下行:

sed '/pattern/ {x; s/pattern/xx/; t'$'\n'' g; }' file

PS:($'\n'不是 a ;)跟隨tor b,使 bsd sed 快樂。

相關內容