Escape-символы, содержащиеся в переменной bash в шаблоне регулярных выражений - PullRequest
4 голосов
/ 29 мая 2010

В моем скрипте bash я пытаюсь выполнить следующую команду Linux:

sed -i "/$data_line/ d" $data_dir

$ data_line вводится пользователем и может содержать специальные символы, которые могут нарушить регулярное выражение. Как я могу избежать всех возможных специальных символов в $ data_line перед выполнением команды sed?

Ответы [ 2 ]

4 голосов
/ 29 мая 2010

Вы можете использовать эту технику для защиты селектора. Строки, отмеченные «*****» ниже, являются значимыми. Остальные в основном для тестирования и демонстрации. Ключ заключается в том, чтобы использовать символ, который не отображается во вводимых пользователем данных, для разделения адреса селектора.

data_line='.*/ s/GOLD/LEAD/g;b;/.*'    # scary user input
candidates='/:.|@#%^&;,!~abcABC'       # *****   # (make it as long as you like)
char=$(echo "$candidates" | tr -d "$data_line")    # *****
char=${char:0:1}   # ***** choose the first candidate that doesn't appear in the user input

if [ -z "$char" ]    # ***** this test checks for exhaustion of the candidate character set
then
    echo "Unusable user input. Recommendation: cigarette and blindfold."
    exit 1
fi

# test without protection
excitement="GOLD, I tell you, thar's GOLD in them thar hills!" 
echo "$excitement" | sed "/$data_line/ d"
# output: "LEAD, I tell you, thar's LEAD in them thar hills!"

# test WITH protection
echo "$excitement" | sed "\\${char}${data_line}${char} d"    # *****
# output: "GOLD, I tell you, thar's GOLD in them thar hills!"

# test WITH protection and useful user input
data_line="secret"
mystery="The secret map is tucked in a hidden compartment in my saddle bag."
echo -e "$excitement\n$mystery" | sed "\\${char}${data_line}${char} d"
# output: "GOLD, I tell you, thar's GOLD in them thar hills!"
4 голосов
/ 29 мая 2010
grep -v -F "$data_line" "$data_dir" > ...
...