パターンを除いて、パターンが最初に発生した後のテキスト行を印刷します(OSX)

パターンを除いて、パターンが最初に発生した後のテキスト行を印刷します(OSX)

以下は、「word」を削除して「word」を含むすべての項目を選択して、「word」を含むフルテキスト行を印刷するスクリプトです。

sed -ne 's/word//p'  file.txt >> newfile.txt

「単語」が最初に表示された後にテキスト行のみを印刷し、印刷された行から「単語」を削除するにはどうすればよいですか?

私はOSXを使用しています。

以下はサンプルテキストです。

Blalala 

'Omfoem From

balanf

word I want this output

word Not this output

Omfoem527

これが私の予想結果です。

 I want this output

更新:必要なタスクを実行するスクリプトは次のとおりです。

sed -n 's/^.*word //p'  file.txt > temp.txt
sed -n '1p' temp.txt >> newfile.txt
rm temp.txt

最初の行は「単語」を削除した後、「単語」を含むテキストの行全体を印刷し、temp.txtファイルから「単語」が表示されるすべての項目を選択します。また、「単語」の前に別のテキストが来る場合に備えて^.*を追加しました。
2行目はtemp.txtファイルの最初の行だけをnewfile.txtに印刷し、3行目はtemp.txtファイルを削除します。

最も効率的ではありませんが、動作します。

答え1

この試み、

sed -n '/word/{n;p;q}' file
  • n -> パターン空間の次の入力行を読み取るか追加します。
  • p ->現在のパターンスペースを印刷します。
  • q ->追加の入力を処理せずに直ちにsedスクリプトを終了します。最初の項目のみ...

答え2

1つのファイルしか処理しないと仮定すると、そしてこのようなパターンが表示されることがありますその行で一度だけ、次が動作します:

awk -F"word" 'NF>1 {print $2; exit}' file

次に、「単語」パターンをフィールド区切り文字として使用し、これらの「フィールド」が複数あることを確認します。その場合は、2番目のフィールド(次のテキストと同じ)を印刷しwordて実行を停止します。

複数のファイルを処理するには、次のものを使用できます。

awk -F"word" 'NF>1 {print $2; nextfile}' file1 file2 ...

ただし、これは移植性が低下します(mawkつまり、適用できません)。

関連情報