2011-03-16 13 views
7

私はegrepにランタイムの前に知られていない文字列を必要とし、シェル変数(シェルはbashです。問題は、その文字列に中かっこ、空白、点、スラッシュなどの特殊文字が含まれることです。未知の文字列を正規表現でエスケープするには?

文字列を知っていれば、一度に1文字ずつエスケープすることができますが、文字列全体でどのようにすることができますか?

sedスクリプトで文字列を実行すると、それぞれの特殊文字の前に\が付いている可能性がありますが、このようなスクリプトをどのように記述する必要がありますか?他に良いオプションがあるかどうかはわかりません。

私はre_format(7)を読みましたが、

EDIT ...「などのリテラル全体の次の文字列を取る」ようなものは存在しないようです:偽陽性を避けるために、私はまた、パターンに改行検出を追加する必要があり、例えば。 egrep '^myunknownstring'

+0

bashで正規表現をエスケープする方法http://stackoverflow.com/questions/11856054/bash-easy-way-to-pass-a-raw-string-to-grep/16951928#16951928 –

答えて

7

あなたはより大きな式に文字列を埋め込むために必要がある場合は、sedは、私はそれを行うだろうかであるを作るために-Fフラグを使用します。

s_esc="$(echo "$s" | sed 's/[^-A-Za-z0-9_]/\\&/g')" # backslash special characters 
inv_ent="$(egrep "^item [0-9]+ desc $s_esc loc .+$" inventory_list)" 
+0

あなたのバージョンがすべてのロケールで動作しないので、代わりに 'sed '/ [^ [:alnum:] _-]/\\&/ g''を試してください – SiegeX

+0

' s_esc = $(echo "$ s" | sed' s/[] \\。$ * {} | +?()[^ - ]/\\&/ g ') 'も動作します。 – skozin

4

は、パターンの固定文字列リテラル

$ var="(.*+[a-z]){3}" 
$ echo 'foo bar (.*+[a-z]){3} baz' | grep -F "$var" -o 
(.*+[a-z]){3} 
+0

チップのおかげでそれは正しいですが、指定するのを忘れていました。行の先頭に_only_という文字列を一致させる必要もあります。私はこの詳細を質問に加えました。 – Luke404

0

あなたは間違ってbashの構文として解釈される文字列を保護しようとしたり、正規表現の構文として解釈される文字列の部分を保護しようとしていますか? bashの保護のための

grepが-fスイッチをサポートしています。

-f FILE, --file=FILE 
    Obtain patterns from FILE, one per line. The empty file contains zero patterns, and therefore matches nothing. 

ませエスケープ処理は、ファイル内に必要ありません。それがあなたがする必要がある場合はシェル変数から生成することができる単一の行(したがって1つのパターン)を含むファイルにしてください。

# example trivial regex 
var='^r[^{]*$' 
pattern=/tmp/pattern.$$ 
rm -f "$pattern" 
echo "$var" > "$pattern" 
egrep -f "$pattern" /etc/password 
rm -f "$pattern" 

ポイントを説明するだけです。

代わりに-Fで試してください。正規表現による保護のために提案された別のポスターとして。

関連する問題