次のような文字列をgrepで検索したいと思います。
something ~* 'bla'
私はこれを試しましたが、シェルは一重引用符を削除します。
grep -i '"something ~* '[:alnum:]'"' /var/log/syslog
正しい検索は何でしょうか?
grep -i "something ~\* '[[:alnum:]]*'" /var/log/syslog
私のために働く。
*
をエスケープして、リテラル*
をゼロ以上の一致文字にする代わりに一致させます。~*
は0回以上の~
の出現に一致しますが、~\*
はsomething
の後の式~*
に一致します:alnum:
を二重括弧で囲みます(例を参照 here )*
の後に[[:alnum::]]
を使用して、単一引用符の間のone文字だけでなく、それらのいくつかを照合しますdoが引用符で引用符を検索する必要がある場合、それを行う醜い構造があります。
echo 'And I said, "he said WHAT?"'
期待どおりに機能しますが、ネストの別のレベルでは、次の機能しませんは期待どおりです。
echo 'She said, "And I said, \'he said WHAT?\'"'
代わりに、内側の単一引用符outsideを単一引用符で囲んだ文字列からエスケープする必要があります。
echo 'She said, "And I said, '\''he said WHAT?'\''"'
または、必要に応じて:
echo 'She said, "And I said, '"'"'he said WHAT?'"'"'"'
それはきれいではありませんが、動作します。 :)
もちろん、物事を変数に入れても、これはすべて意味がない。
[ghoti@pc ~]$ i_said="he said WHAT?"
[ghoti@pc ~]$ she_said="And I said, '$i_said'"
[ghoti@pc ~]$ printf 'She said: "%s"\n' "$she_said"
She said: "And I said, 'he said WHAT?'"
[ghoti@pc ~]$
:-)
[[:alnum:]]
(2つのブラケット)で指定されます[[:alnum:]]
はone文字のみに一致します。ゼロ個以上の文字に一致させる場合[[:alnum:]]*
" "
を使用して正規表現を引用できます:
grep -i "something ~\* '[[:alnum:]]*'" /var/log/syslog
マッテオ
あなたの表現によると、最初に'
、次に"
を使用しているようです。一重引用符をエスケープする場合は、'
を使用してエスケープするか、二重引用符を使用できます。また、Matteoのコメントにあるように、文字クラスには二重の角括弧があります。
grep -i "something \~\* '[[:alnum:]]+'" /var/log/syslog
または
grep -i 'something ~* \'[[:alnum:]]+\'' /var/log/syslog