我試圖逃避用戶提供的搜索字符串,它可以包含任意字符並將其提供給sed,但無法弄清楚如何使sed安全使用。在sed中,我們做s/search/replace/
,我想在搜索字符串中搜索完整的字符而不用sed解釋它們(例如,'my/path'中的'/'不會關閉sed表達式)。你如何逃避用戶提供的搜索詞,你不想評估sed?
我讀this related question有關如何逃生替換任期。我原以爲你會去search做同樣的事情,但顯然不是因爲sed抱怨。
下面是一個示例程序,它創建一個名爲「my_searches」的文件。然後它讀取該文件的每一行並執行搜索並使用sed進行替換。
#!/bin/bash
# The contents of this heredoc will be the lines of our file.
read -d '' SAMPLES << 'EOF'
/usr/include
[email protected]$$W0RD$?
"I didn't", said Jane O'Brien.
`ls -l`
[email protected]#$%^&*()_+-=:'}{[]/.,`"\|
EOF
echo "$SAMPLES" > my_searches
# Now for each line in the file, do some search and replace
while read line
do
echo "------===[ BEGIN $line ]===------"
# Escape every character in $line (e.g., ab/c becomes \a\b\/\c). I got
# this solution from the accepted answer in the linked SO question.
ES=$(echo "$line" | awk '{gsub(".", "\\\\&");print}')
# Search for the line we read from the file and replace it with
# the text "replaced"
sed 's/'"$ES"'/replaced/' < my_searches # Does not work
# Search for the text "Jane" and replace it with the line we read.
sed 's/Jane/'"$ES"'/' < my_searches # Works
# Search for the line we read and replace it with itself.
sed 's/'"$ES"'/'"$ES"'/' < my_searches # Does not work
echo "------===[ END ]===------"
echo
done < my_searches
當你運行程序,你會得到sed: xregcomp: Invalid content of \{\}
該文件的最後一行時,它作爲「搜索」一詞,而不是「取代」一詞。我在上面標記了# Does not work
這個錯誤的行。
------===[ BEGIN [email protected]#$%^&*()_+-=:'}{[]/.,`"| ]===------
sed: xregcomp: Invalid content of \{\}
------===[ END ]===------
如果不逃的字符$line
(即sed 's/'"$line"'/replaced/' < my_searches
),你得到這個錯誤,而不是因爲SED試圖解釋各種人物:
------===[ BEGIN [email protected]#$%^&*()_+-=:'}{[]/.,`"| ]===------
sed: bad format in substitution expression
sed: No previous regexp.
------===[ END ]===------
那麼,如何逃脫搜索term for sed,以便用戶可以提供任意文本來搜索?或者更確切地說,我可以用我的代碼中的ES=
行代替什麼,以便sed命令適用於文件中的任意文本?
我使用sed,因爲我僅限於busybox中包含的實用程序子集。雖然我可以使用其他方法(如C程序),但確實知道是否有解決此問題的方法是很好的。
這是我試圖解決的實際問題。我正在從包含用戶輸入的字符串的文件中讀取一行,並用另一個字符串(也包含用戶輸入的數據)替換它。我使用bash和sed,因爲我有一套有限的實用程序(busybox)。我試圖讓用戶輸入任何可能的字符,並仍然在sed表達式中工作。 – indiv 2010-02-25 16:54:13