dak*_*aka 8 command-line sed text-processing tr
如何在每个空格前加上反斜杠,最好是使用tr或sed命令?
这是我的脚本:
#!/bin/bash
line="hello bye"
echo $line | tr ' ' "\\\ "
Run Code Online (Sandbox Code Playgroud)
这应该用反斜杠后跟一个空格替换空格,但它只是用反斜杠替换空格而不是反斜杠+空格。
这是我得到的输出:
hello\bye
Run Code Online (Sandbox Code Playgroud)
预期输出:
hello\ bye
Run Code Online (Sandbox Code Playgroud)
ter*_*don 18
tr不能做多个字符。改用其中之一:
sed
echo "$line" | sed 's/ /\\ /g'
Run Code Online (Sandbox Code Playgroud)
或者
sed 's/ /\\ /g' <<< "$line"
Run Code Online (Sandbox Code Playgroud)珀尔
echo "$line" | perl -pe 's/ /\\ /g'
Run Code Online (Sandbox Code Playgroud)
或者
perl -pe 's/ /\\ /g'<<< "$line"
Run Code Online (Sandbox Code Playgroud)
Perl 也有一个漂亮的函数调用quotemeta,它可以转义字符串中的所有奇怪的东西:
line='@!#$%^&*() _+"'
perl -ne 'print quotemeta($_)' <<< $line
Run Code Online (Sandbox Code Playgroud)
以上将打印
\@\!\#\$\%\^\&\*\(\)\ _\+\"\
Run Code Online (Sandbox Code Playgroud)您还可以使用printf和%q:
%q quote the argument in a way that can be reused as shell input
Run Code Online (Sandbox Code Playgroud)
所以,你可以做
echo "$line" | printf "%q\n"
Run Code Online (Sandbox Code Playgroud)
请注意,这与 Perl 一样,quotemeta将转义所有特殊字符,而不仅仅是空格。
printf "%q\n" <<<$line
Run Code Online (Sandbox Code Playgroud)如果您在变量中有该行,则可以直接在 bash 中执行此操作:
echo ${line// /\\ }
Run Code Online (Sandbox Code Playgroud)还有就是AWK缺少在所有可能的解决方案列表:)
$ echo "Hello World" | awk '{gsub(/ /,"\\ ");print}'
Hello\ World
Run Code Online (Sandbox Code Playgroud)