特定の行を読み、「abc」で始まり、「def」で終わる文字列部分を抽出するにはどうすればよいですか?

特定の行を読み、「abc」で始まり、「def」で終わる文字列部分を抽出するにはどうすればよいですか?

「abc」と「def」で始まる文字列の一部を印刷しようとしています。例:

123456789
123abc_fff_def456789
123456789
...

結果:

abc_fff_def

答え1

非標準オプションをgrepサポート-oする場合:-P

grep -Po 'abc.*?def' < your-file

abcdef同じ行にあるとします。行ごとに複数のイベントを報告できます。

.*?ゼロ個以上の文字で構成されるシーケンスと一致します。できるだけ少ない、これは.*一致します多いほど良い。これは入力に影響を与えます。たとえば、0abc1def2def3with .*?、 you get abc1defwhile with .*、 you get abc1def2def(そして on 0abc1def2abc3def4, you get abc1defand abc3defvs abc1def2abc3def)。

0abc1abc2def3それにもかかわらず、次のような入力abc1abc2defから早いできるだけたくさん。

複数行のデータを一致させるには、次を使用できますperlPinはgrep -P実際にはPerlなどの正規表現で使用されます)。

perl -l -0777 -ne 'print for /abc.*?def/gs' < your-file

答え2

grepとの間に潜在的な文字を許可する非常に単純な正規表現を使用してください。abcdef

grep -o 'abc.*def' input

答え3

注文する

sed "s/[^a-z].[^a-z]//g" file


 grep -o "[a-z].*[a-z]" file

出力

abc_fff_def

答え4

Gnu sed /def/ を表示するときはフラグを接頭辞として使用し、/abc/ を表示するときはフラグを接尾辞として使用します。その後、パターン空間の先頭まで /abc/ バブルが現れるまで、狂ったように切り抜き続けます。

$ sed -ne '
    /\n/{/^abc.*def\n/P;D;}
    s/def/&\n/;s/abc/\n&/
    /\n.*\n/D
' file

Perlを使用して、パターンが存在するかどうかに応じてORS => $ \に適切な値を割り当てます。ペアのみ印刷

perl -lpe '
  $\    = /(abc.*?def)/ ? $/ : $,;
  $_=$1;
' file

関連情報