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;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 が満足します。

関連情報