0

私はここで本当に明らかに間違ったことをしていると確信していますが、私は何を理解することができません。bashシェルからgrepを使用して、ファイルtest.txtがあります。

ABC123
ABC456
ABC789
DEF123
DEF456
DEF789

コマンドラインで:

$ grep ABC test2.txt
ABC123
ABC456
ABC789

$ grep DEF test2.txt
DEF123
DEF456
DEF789

したがって、これらはうまく機能します。今、私は次のコマンドがファイル全体を印刷することを期待していますが、

$ grep ABC\|DEF test2.txt

$ grep (ABC)\|(DEF) test2.txt
-bash: syntax error near unexpected token `ABC'

$ grep \(ABC\)\|\(DEF\) test2.txt

$ grep 'ABC|DEF' test2.txt

私は何が間違っているのですか?

4

4 に答える 4

3

-Eを使用して拡張正規表現をオンにします。

grep -E "ABC|DEF" test2.txt
于 2012-10-26T15:55:16.227 に答える
2

他の人が指摘しているように、標準コマンドはまたは構文grepをサポートしていません。残念ながら、そこから、物事はミッシュマッシュです。

  • 一部のシステムには、egrep提供または構文を提供するがあります。
  • 一部のシステムでは、-Eor -P(Perlの場合)フラグを使用してgrep構文を拡張できます。
  • -E一部のシステムには、との両方がegrepあり、同じことを行います。これは、同じgrep -Eではないシステムが存在することを意味します。egrep(悲しいですが本当)。
  • 一部のシステムでは、標準grepコマンドで拡張正規表現を使用するようになりました。どうやら、あなたのシステムはそうではありません。

マンページを読んで、システムが何をサポートしているかを確認してください。一部のシステムにはre_format、拡張形式でサポートされているものとサポートされていないものを説明するマンページがあります。

繰り返しになりますが、いつでもPerlワンライナーを使用できます。

$ perl -ne "print if /(ABC)|(DEF)/" test.txt

少なくとも、あなたはサポートするすべてのものを知っています。

于 2012-10-26T16:12:42.810 に答える
1

標準の構文ではサポートされていないと思います。-P可能な場合は、スイッチを使用できます。

grep -P "(ABC|DEF)" test2.txt
于 2012-10-26T15:54:58.100 に答える
1

代わりに使用してください。これは、 :egrepを使用するのと同じです。grep -E

egrep 'ABC|DEF' test2.txt
于 2012-10-26T15:57:06.863 に答える