sed -i 's/\#/\\\#/g' ./file.txt
sed -i 's/\$/\\\$/g' ./file.txt
sed -i 's/\%/\\\%/g' ./file.txt
sed -i 's/\&/\\\&/g' ./file.txt
sed -i 's/\_/\\\_/g' ./file.txt
Вам не нужно \
в первой строке (поиска) на большинстве из них, просто $
(это специальный символ, означающий конец строки; остальные не являются специальными).А при замене нужно всего два \\
, а не три.Кроме того, вы можете сделать все это в одном с несколькими -e
утверждениями:
sed -i.bak -e 's/#/\\#/g' \
-e 's/\$/\\$/g' \
-e 's/%/\\%/g' \
-e 's/&/\\&/g' \
-e 's/_/\\_/g' file.txt
Вам не нужно ничего экранировать (кроме \\
), потому что они в одинарных кавычках.В вашем grep
, bash
интерпретирует escape на $
, потому что это специальный символ (в частности, сигил для переменных), поэтому grep
получает и ищет только $
, который являетсяспециальный символ, означающий конец строки.Вам нужно либо заключить его в одинарную кавычку, чтобы bash
не интерпретировал \
('\$'
), либо добавить еще одну пару \\
: "\\\$". Presumably, that's where you're getting the
\ `from, но вам не нужно это в sed
как написано.