我想刪除第一行之後包含模式的每一行(模式是/^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 ;
)跟隨t
or b
,使 bsd sed 快樂。