特定のパターンより前のすべての単語を削除したいです。たとえば、以前のすべての単語を削除したいと思いますSTAC
。
入力する:
asd
asdd
asddd
STAC
asd
as
出力:
STAC
asd
as
このコードがありますsed -ni "s/^.*STAC//d" myfile
答え1
sed
行ごとに機能するため、試行は機能しません。
それではどうすればいいですかsed
?STAC
行(/^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を使用して削除します。