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

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

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などの他のツールを使用するか、ファイルに複数回パスする必要があります。

答え2

使用幸せ(以前のPerl_6)

出力ファイルは、先頭から「sentinel」行まで(含まれていない)すべての行です。

~$ raku -e 'my Str $K1 = "Station Name"; put slurp.split($K1)[0];'   file
---- Huge text -- not interested

#OR:

~$ raku -ne 'BEGIN my @a; @a.push: $_ unless /Station \s Name/ && last; END .put for @a;'   file
---- Huge text -- not interested 

#OR:

~$ raku -ne '.put unless /Station \s Name/ fff *;'   file
---- Huge text -- not interested

2つの「センチネル」ライン間(および含む)の出力ライン(注 - 場所フィルタリングこの「開始行/終了行」パターンを満たす複数のレコード):

~$ raku -ne '.put if  /Station \s Name/ fff /Data \s End/;'  file  
Station Name 
100 - 200 lines
Data End

「sentinel」行からファイルの終わりまで(除外)ファイルのすべての行を出力します。

~$ raku -e 'my Str $K2 = "Data End\n"; put slurp.split($K2, 2)[1];'   file 
---- Again text --- 

#OR:

~$ raku -ne '.put if /Data \s End/ ^fff *;'   file
---- Again text --- 

注:Rakuの「トリガー」演算子には、追加および変形演算子だけ/ … / fff / … /でなく、いくつかのオプションがあります。キャレットは、識別された行が戻り値に表示されないことを示します(ステートメントが否定されない限り)。^ffffff^^fff^^

入力例:

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

https://docs.raku.org/言語/operators#infix_fff
https://raku.org

関連情報