エスケープされた一重引用符がgrepで機能しないのはなぜですか?


0

私は文字列を一致させようとしています:

* * * * * /usr/local/bin/growlnotify -t 'helloTitle' -m 'helloMessage' -n 'myApp' -sw

で:

crontab -l | grep '^[^#].*/usr/local/bin/growlnotify.*\-n \'myApp\'.*$'

動作しません:一致するものはありません。

しかし:

crontab -l | grep '^[^#].*/usr/local/bin/growlnotify.*\-n.*$'

非常に良い動作:

* * * * * /usr/local/bin/growlnotify -t 'helloTitle' -m 'helloMessage' -n 'myApp' -sw

問題は\'myApp\'何ですか?

grep / sedで一重引用符をエスケープする方法は?


あなたが本当にあなたのポイントを証明するために単純な例を使用していたはずです-1
barlop

回答:


3

-eオプションと16進表現を使用して、単一引用符をエスケープできます。

echo -e '\047'
> '

または、16進表現と-Pオプションを使用したgrepで:

crontab -l | grep -P '^.*/usr/local/bin/growlnotify.*\-n \047myApp\047.*$'
> * * * * * /usr/local/bin/growlnotify -t 'helloTitle' -m 'helloMessage' -n 'myApp' -sw

参照としてのss64

-P
   --perl-regexp
       Interpret PATTERN as a Perl regular expression.

GNU grepを使用している場合は'、式を囲む一重引用符を二重引用符"(2文字を変更)で置き換え、バックスラッシュを削除\(3文字を削除)することもできます。コピー/貼り付けの証拠echo "* * * * * /usr/local/bin/growlnotify -t 'helloTitle' -m 'helloMessage' -n 'myApp' -sw" | grep "^[^#].*/usr/local/bin/growlnotify.*-n 'myApp'.*$"
アダム

0

申し訳ありませんが、単一引用符内の単一引用符をエスケープすることはできません。二重引用符を使用する必要があります。あなたはそれを自分で証明することができます:

echo '\'' <-- doesn't work

シェルは別の引用符を期待します。


2
明確にするために:「\」は単一引用符内の何かをエスケープするために使用できません。これはgrep / sedの問題ではありません。これはシェルの問題です(bash、cshなど)。
スコット
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.