「abc」と「def」で始まる文字列の一部を印刷しようとしています。例:
123456789
123abc_fff_def456789
123456789
...
結果:
abc_fff_def
答え1
非標準オプションをgrep
サポート-o
する場合:-P
grep -Po 'abc.*?def' < your-file
abc
とdef
同じ行にあるとします。行ごとに複数のイベントを報告できます。
.*?
ゼロ個以上の文字で構成されるシーケンスと一致します。できるだけ少ない、これは.*
一致します多いほど良い。これは入力に影響を与えます。たとえば、0abc1def2def3
with .*?
、 you get abc1def
while with .*
、 you get abc1def2def
(そして on 0abc1def2abc3def4
, you get abc1def
and abc3def
vs abc1def2abc3def
)。
0abc1abc2def3
それにもかかわらず、次のような入力abc1abc2def
から早いできるだけたくさん。
複数行のデータを一致させるには、次を使用できますperl
(P
inはgrep -P
実際にはPerlなどの正規表現で使用されます)。
perl -l -0777 -ne 'print for /abc.*?def/gs' < your-file
答え2
grep
との間に潜在的な文字を許可する非常に単純な正規表現を使用してください。abc
def
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