sed は一致する前にすべての単語を削除します

sed は一致する前にすべての単語を削除します

特定のパターンより前のすべての単語を削除したいです。たとえば、以前のすべての単語を削除したいと思いますSTAC

入力する:

asd
asdd
asddd
STAC
asd
as

出力:

STAC
asd
as

このコードがありますsed -ni "s/^.*STAC//d" myfile

答え1

sed行ごとに機能するため、試行は機能しません。

それではどうすればいいですかsedSTAC行(/^STAC$/)から始めてファイルの終わり()までのアドレス範囲を定義します$。これらは印刷する必要があるため、他のすべて(!)を削除する必要がありますd

sed -i '/^STAC$/,$!d' myfile

答え2

awk一致(一致項目を含む)以降のすべての行を印刷するバリアント:

$ awk '/^STAC$/ { out=1 } out' file
STAC
asd
as

これは文字列のみを含む行と一致し、ゼロ以外の値にSTAC設定されます。out~のため行がoutゼロでない場合は印刷します。

正規表現の一致ではなく、文字列比較に$0 == "STAC"置換を使用します。/^STAC$/


正規表現の一致のブール結果を整数として使用すると(整合なしの場合は0、一致の場合は1)、少し混乱しますが短くなります。

awk 'p += /^STAC$/' file

結果がpゼロでない場合(つまり、正規表現が最初に一致する点から始まる)、現在の行が印刷されます。

正規表現の一致ではなく、文字列比較にp += ($0 == "STAC")置換を使用します。p += /^STAC$/

答え3

別のオプションは、次のスクリプト対応エディタを使用することですed

printf '%s\n' '1,/^STAC/-1 d' 'wq' | ed -s myfile

これにより、2つのコマンドが印刷されますed

  • 1から(で始まる行の前の行STAC)までの行を削除します。
  • ファイルをディスクに書き戻して終了します。

この-sオプションは、ed読み書き可能なバイト数のデフォルト印刷を無効にします。

答え4

grep -wn STAC file.txt | cut -d":" -f 1 | xargs -I % sed '1,%d' file.txt

単語の行番号を取得してxargsに渡し、sedを使用して削除します。

関連情報