Как я могу поместить обратную косую черту перед каждым пространством, предпочтительно при помощи tr
или sed
команды?
Вот мой сценарий:
#!/bin/bash
line="hello bye"
echo $line | tr ' ' "\\\ "
Это, как предполагается, заменяет пробелы обратной косой чертой, сопровождаемой пространством, но это только заменяет пробелы обратной косой чертой и не backlash+space.
Это - вывод, который я получаю:
hello\bye
Ожидаемый вывод:
hello\ bye
tr
не может сделать нескольких символов. Используйте один из них вместо этого:
sed
echo "$line" | sed 's/ /\\ /g'
или
sed 's/ /\\ /g' <<< "$line"
Perl
echo "$line" | perl -pe 's/ /\\ /g'
или
perl -pe 's/ /\\ /g'<<< "$line"
Perl также назвали изящную функцию quotemeta
который может выйти из всех нечетных вещей в строке:
line='@!#$%^&*() _+"'
perl -ne 'print quotemeta($_)' <<< $line
Вышеупомянутое распечатает
\@\!\#\$\%\^\&\*\(\)\ _\+\"\
Можно также использовать printf
и %q
:
%q quote the argument in a way that can be reused as shell input
Так, Вы могли сделать
echo "$line" | printf "%q\n"
Обратите внимание что это, как Perl quotemeta
выйдет из всех специальных символов, не просто располагает с интервалами.
printf "%q\n" <<<$line
Если у Вас есть строка в переменной, Вы могли бы просто сделать это непосредственно в ударе:
echo ${line// /\\ }
Существует AWK
пропавшие без вести в списке всех возможных решений :)
$ echo "Hello World" | awk '{gsub(/ /,"\\ ");print}'
Hello\ World