最初の行の後のパターンを含むすべての行を削除したいのですが(パターンは です/^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;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'
(not a ;
)t
が または の後に続くためb
、bsd sed が満足します。