4

grep で文字列の一致する部分のみを表示する (-o フラグ) の逆、つまり、正規表現に一致する部分以外のすべてを表示する方法はありますか?

つまり、 -v フラグは答えではありません。これは、一致を含むファイルをまったく表示しないためですが、これらの行を表示したいのですが、一致する行の一部は表示したくありません。

編集:複数行で「一致のみ」の一致を実行できるため、sedよりもgrepを使用したかったのですが、次のようにします。

cat file.xml|grep -Pzo "<starttag>.*?(\n.*?)+.*?</starttag>"
4

3 に答える 3

4

grepこれはかなり珍しい要件です。そのように文字列を交互に入れ替えるとは思いません。sedただし、これは で実現できます。

sed -n 's/$PATTERN//gp' file

OPの編集に応じて編集:

sedファイルがすべてメモリにロードするのに十分小さい場合は、を使用して複数行のマッチングも実行できます。

sed -rn ':r;$!{N;br};s/<starttag>.*?(\n.*?)+.*?<\/starttag>//gp' file.xml
于 2012-12-05T22:01:27.763 に答える
3

あなたはからの少しの助けでそれを行うことができますsed:

grep "pattern" input_file | sed 's/pattern//g'
于 2012-12-05T22:01:51.100 に答える
1

grep に方法はないと思います。

ackを使用すると、Perl の特殊変数 $` および $' 変数を出力して、それぞれ一致前後のすべてを表示できます。

ack string --output="\$`\$'"

同様に、一致したものを他のテキストと一緒に出力したい場合は、一致した文字列を含む $& を使用できます。

ack string --output="Matched: $&"
于 2012-12-05T22:01:08.777 に答える