7

Linuxのgrepコマンドで正規表現を使おうとしています

(^\s*\*\s*\[ \][^\*]+?(\w*\:[^\*]+\d$)|([^\*]+[.]com[.]au$))

https://www.regextester.comでファイルの内容を試してみると、必要な結果が得られます。つまり、必要なフィールドが一致していますが、次のように使用しようとすると、

grep '(^\s*\*\s*\[ \][^\*]+?(\w*\:[^\*]+\d$)|([^\*]+[.]com[.]au$))' file1

それが私に与えるのはnullだけです!

ここでの問題は何ですか?

4

3 に答える 3

3

grepのような文字クラスを理解していないと思います。またはを使用してみてください。(と同等で、入力するよりも短いです。)\w\sgrep -Eegrepgrep -Eegrepegrep

したがって、コマンドは次のようになります。

egrep '(^\s*\*\s*\[ \][^\*]+?(\w*\:[^\*]+\d$)|([^\*]+[.]com[.]au$))' file1
于 2012-06-13T11:41:50.640 に答える
2
pcregrep -M  '(^\s*\*\s*\[ \][^\*]+?(\w*\:[^\*]+\d$)|([^\*]+[.]com[.]au$))'

トリックをしました:)

于 2012-06-13T18:37:21.283 に答える
0

grep(1)デフォルトではPOSIX基本正規表現を使用し、オプションとともに使用するとPOSIX拡張正規表現を使用し-E ます。

POSIX正規表現では、特殊文字以外の文字は、エスケープされたときに未定義の動作をします。\s、および貪欲でないマッチングの構文はありません。+?。さらに、BREでは、+および|演算子は使用できず、グループ化を実行するには括弧をエスケープする必要があります。

POSIX文字クラス [[:space:]]とは、それぞれとの[[:alnum:]_]移植可能な代替手段です。\s\w

繰り返しから次の一致する文字を除外することで、欲張りでない一致をエミュレートできます。[^*]+?\w*:と同等[^*[:alnum:]_:]+[[:alnum:]_]*:です。

指定された正規表現は、複数のBREとして表すことができます。

grep -e '^[[:space:]]*\*[[:space:]]\{1,\}\[ \][^*[:alnum:]_+]\{1,\}[[:alnum:]_]*:[^*]\{1,\}[[:digit:]]$' \
    -e '[^*]\{1,\}\.com\.au$' file1

またはERE:

grep -E '^[[:space:]]*\*[[:space:]]*\[ \][^*[:alnum:]_:]+[[:alnum:]_]*:[^*]+[[:digit:]]$|[^*]+\.com\.au$' \
    file1

のGNU実装では、移植性のない拡張機能としてgrep(1)、短い文字クラス(\sおよび\w)と貪欲でない繰り返し( )の両方が許可されていることに注意してください。+?

于 2017-02-27T23:11:52.907 に答える