2012-03-22 14 views
2

文字列 "$ server ['fish_stick']"(二重引用符を無視)単一引用符付きのgrep文字列を検索しますか?

この文字列の完全一致のためにgrepを正常に実行する方法がわかりません。私は多くの方法を試しました。

私が試した、

rgrep -i \$'server'\[\''fish'\_'stick'\'\] . 

rgrep -i "\$server\[\'fish\_stick\'\]" . 

rgrep -i '\$server\[\'fish\_stick\'\]' . 

は、それは私の問題を引き起こしている単一引用符ですか? 最初のgrepをエコーすると、検索したいものが表示されますが、$ serverを持つもののようなガベージ結果が返されます。

ありがとうございました!

答えて

1

ここでの主な問題は、grepに引き渡された引数を引用していないことです。エスケープする必要があるのは、\ $(二重引用符の場合)と[]のみです。あなたが(正規表現を使用していない)正確な文字列をしたい場合は、単に正確な文字列マッチングを行うとfgrep(grepの-F)を使用します。私のシステムで

grep -F "\$server['fish_stick']" 

作品:

$ foo="\$server['fish_stick']" 
$ echo "$foo" | grep -F "\$server['fish_stick']" 
$server['fish_stick'] 

正規表現を使用する:

$ echo "$foo" | grep "\$server\['fish_stick'\]" 
$server['fish_stick'] 

正規表現を使用して処理するネストされた単一引用符:

$ echo "$foo" | grep '\$server\['\''fish_stick'\''\]' 
$server['fish_stick'] 

一重引用符の内部では、ネストされた一重引用符をエスケープすることはできません。引用符を閉じて、それを再度開いて、単一引用符を "エスケープ"する必要があります。

http://mywiki.wooledge.org/Quotes

0

私はあなたが引用の問題をせずに変数にその文字列を取得する方法を求めていると仮定しないでください。あなたがいる場合は、ここでヒアドキュメントを使用した方法です:

str=$(cat <<'END' 
$foo['bar'] 
END 
) 

grepのための特殊文字のエスケープについてのあなたの懸念に対処するために、あなたは任意の英数字以外の文字の前にバックスラッシュを置くためにSEDを使用することができます。

grep "$(sed 's/[^[:alnum:]]/\\&/g' <<< "$str")" ... 

set -xと一緒に使用すると、grepコマンドは次のようになります。grep '\$foo\[\'\''bar\'\''\]' ...

関連する問題