我怎样才能在每个空格前加上反斜杠,最好使用tr
或sed
命令?
这是我的脚本:
#!/bin/bash
line="hello bye"
echo $line | tr ' ' "\\\ "
这应该用反斜杠后跟空格来替换空格,但它只是用反斜杠替换空格,而不是用反斜杠+空格来替换空格。
这是我得到的输出:
hello\bye
预期输出:
hello\ bye
答案1
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
如果变量中有此行,则可直接在 bash 中执行此操作:
echo ${line// /\\ }
答案2
AWK
所有可能的解决方案的列表中缺少:)
$ echo "Hello World" | awk '{gsub(/ /,"\\ ");print}'
Hello\ World