Добавление строки, содержащей escape-символ с sed

В настоящее время я использую:

sed -i -e "5a\\ ${text}" $filename 

добавить что-то в определенную строку, где переменный текст содержит строку, такую ​​как «\ epsilon».

Когда используешь

 echo -E $text 

строка отображается просто отлично, но когда я расширяю ее в строке, которую я sed , все escape-символы расширяются, и результат не то, что я хочу.

Как я могу заставить sed использовать исходное содержимое этой строки, не избегая ничего?

Команда sed a\ интерпретирует escape- a\ , поэтому вам нужно дублировать обратную косую черту в строке, которую вы интерполируете. Попробуй это:

 sed -e "5a\\ $(echo -E "$text" | sed -e 's/\\/\\\\/g')" 

Цитата сложна. Я рекомендую использовать инструмент, который не требует добавления дополнительных кавычек, таких как awk или perl. Эти два инструмента позволяют передавать параметры в командной строке или через среду и использовать их в текстовых манипуляциях. С Perl:

 export text perl -i -pe '$_ .= "$ENV{text}\n" if $. == 5' "$filename" 

С awk вам нужно сделать файл, перемещающийся вручную:

 tmp=$(TMPDIR=$(dirname -- "$filename") mktemp) awk -v text="$text" '{print} NR==5 {print text}' <"$filename" >"$tmp" && mv -- "$tmp" "$filename" 

Обычно вы можете использовать escaping с printf "%q" , попробуйте следующее:

 text='\epsilon' echo -e "$text" silon 

с %q :

 text=$(printf "%q" '\epsilon') echo -e "$text" \epsilon 

Поскольку я не мастер седанов, мне легче объяснить эхом.

Используйте одинарные кавычки вместо двойных кавычек.

example1:

 echo "one\\two" one\two 

example2:

 echo 'one\two' one\two 

Таким образом, используя метод example2, вам не нужно скрываться. Строка внутри одиночных кавычек \ t \ r \ i \ n \ g 'интерпретируется как есть. (Символ \ не работает как escape-символ)

источник: один