web-dev-qa-db-ja.com

Bash / Grepで単一引用符をエスケープする方法は?

次のような文字列をgrepで検索したいと思います。

something ~* 'bla'

私はこれを試しましたが、シェルは一重引用符を削除します。

grep -i '"something ~* '[:alnum:]'"' /var/log/syslog

正しい検索は何でしょうか?

27
JohnnyFromBF
grep -i "something ~\* '[[:alnum:]]*'" /var/log/syslog

私のために働く。

  • 最初の*をエスケープして、リテラル*をゼロ以上の一致文字にする代わりに一致させます。
    ~*は0回以上の~の出現に一致しますが、
    ~\*somethingの後の式~*に一致します
  • :alnum:を二重括弧で囲みます(例を参照 here
  • *の後に[[:alnum::]]を使用して、単一引用符の間のone文字だけでなく、それらのいくつかを照合します
  • 単一引用符は、二重引用符で囲まれた式に含まれているため、エスケープする必要はありません。
13
eckes

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 ~]$ 

:-)

42
ghoti
  • 文字クラスは[[:alnum:]](2つのブラケット)で指定されます
  • [[:alnum:]]one文字のみに一致します。ゼロ個以上の文字に一致させる場合[[:alnum:]]*
  • " "を使用して正規表現を引用できます:

    grep -i "something ~\* '[[:alnum:]]*'" /var/log/syslog
    

マッテオ

1
Matteo

あなたの表現によると、最初に'、次に"を使用しているようです。一重引用符をエスケープする場合は、'を使用してエスケープするか、二重引用符を使用できます。また、Matteoのコメントにあるように、文字クラスには二重の角括弧があります。

grep -i "something \~\* '[[:alnum:]]+'" /var/log/syslog

または

grep -i 'something ~* \'[[:alnum:]]+\'' /var/log/syslog
0
Diego Sevilla