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は、ファイルの終わりまで、または次に「データの終わり」が発生するまで、「データの終わり」を確認した後に表示される行を維持する必要があります。 、移植性がないため、sed
Perlや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 / … /
でなく、いくつかのオプションがあります。キャレットは、識別された行が戻り値に表示されないことを示します(ステートメントが否定されない限り)。^fff
fff^
^fff^
^
入力例:
---- Huge text -- not interested
Station Name
100 - 200 lines
Data End
---- Again text ---
https://docs.raku.org/言語/operators#infix_fff
https://raku.org