テキスト処理 - 与えられた単語の前後のテキストを見つける

テキスト処理 - 与えられた単語の前後のテキストを見つける

Station NameファイルとData Endファイルの内容の間で抽出したいと思います。

説明のためのテキストファイル構造:

---- Huge text -- not interested
Station Name 
100 - 200 lines
Data End
---- Again text --- 

どのようにデータを簡単に抽出できますか?

通常、データの特定の部分を見つけてそれを処理(削除/交換など)するにはどうすればよいですか?つまり、特定の単語の前ですか?それとも、特定の単語の後ろに?またはそれらの間?

希望の出力

ケース1:最初から与えられた単語/パターンまで
ケース2:与えられた2つの単語/パターンの間
ケース3:与えられた単語/パターンからファイルの終わりまで。

ベストアンサー1

sed '/Station Name/,$!d; /Data End/q'

つまり、「駅名」を含む最初の行と最後の行($)を除くすべての行を削除します。その後、コマンドがエスケープされた行のd「Data End」と一致する場合は終了します(ただし、終了する前に印刷してください)。

したがって、「Station Name」の最初の発生と「Data End」の最初の発生の間の行を印刷します(「Data End」と同じ行にあるかどうかを含む)。

ボーダーを無視するには、より複雑になります。

sed -ne '1,/Station Name/d; /Data End/!{p;n;}' -e q

「Station Name」が最初の行にある場合、または「End of Data」と同じ行にない場合は有効です。一部の実装では行範囲内の行をsed参照できますが、これは移植可能ではありません。0しかし、解決策があります。 sed FAQをご覧ください。

「駅名」と「駅名」の間に最初に表示されるテキストを見つけるには、状況がより複雑になります。最後「データの終わり」が発生する理由は、この場合、ファイルの終わりに達する前に最後の「データの終わり」に達したかどうかわからないからです。 sedは、ファイルの終わりまで、または次に「データの終わり」が発生するまで、「データの終わり」を確認した後に表示される行を維持する必要があります。 、移植性がないため、sedPerlやawkなどの他のツールを使用するか、ファイルに複数回パスする必要があります。

おすすめ記事