![如何在所有空格前添加反斜杠?](https://linux22.com/image/1049587/%E5%A6%82%E4%BD%95%E5%9C%A8%E6%89%80%E6%9C%89%E7%A9%BA%E6%A0%BC%E5%89%8D%E6%B7%BB%E5%8A%A0%E5%8F%8D%E6%96%9C%E6%9D%A0%EF%BC%9F.png)
我怎样才能在每个空格前加上反斜杠,最好使用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