2011-03-16 60 views
7

我需要egrep這是一個在運行時不知道的字符串,我將通過shell變量獲取(如果有問題,shell是bash)。問題是,該字符串將包含特殊字符,如大括號,空格,點,斜線等。如何在正則表達式中轉義以前未知的字符串?

如果我知道字符串,我可以一次轉義一個特殊字符,但是我怎樣才能完成整個字符串?

通過一個sed腳本運行字符串來爲每個特殊字符加上\前綴可能是一個想法,我仍然需要rtfm如何寫這樣的腳本。我不知道是否還有其他更好的選擇。

我看過re_format(7),但它似乎有一個像「取整下一個字符串爲文字」沒有這樣的事......

編輯:爲了避免誤報,我還要補充換行符檢測到的格局,例如。 egrep '^myunknownstring'

+0

如何在bash中跳過正則表達式http://stackoverflow.com/questions/11856054/bash-easy-way-to-pass-a-raw-string-to-grep/16951928#16951928 – 2013-06-06 00:29:33

回答

7

如果您需要將字符串嵌入到一個更大的表達式,sed是我會怎麼做。

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's/[^ [:alnum:] _-]/\\&g''而不是因爲您的版本不適用於所有語言環境 – SiegeX 2011-03-16 18:39:13

+0

's_esc = $(echo「$ s」| sed' s/[] \\。$ * {} | +?()[^ - ]/\\&/ g')'也應該有效。 – skozin 2014-11-04 14:09:16

4

使用-F標誌,使模式的固定文字串

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

感謝提示,這是正確的,但我忘了指定我也需要匹配字符串_only_開頭的行。我在問題中添加了這個細節。 – Luke404 2011-03-20 16:20:13

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. 

免不了需要裏面的文件。如果這是你需要做的事情,只需將它作爲一個文件包含一行(從而一個模式)可以從你的shell變量產生。

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

只是爲了說明這一點。

-F一起嘗試使用它作爲另一張海報建議正則表達式保護。

相關問題