如何在所有空格前添加反斜杠?

dak*_*aka 8 command-line sed text-processing tr

如何在每个空格前加上反斜杠,最好是使用trsed命令?

这是我的脚本:

#!/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不能做多个字符。改用其中之一:

  1. sed

    echo "$line" | sed 's/ /\\ /g' 
    
    Run Code Online (Sandbox Code Playgroud)

    或者

    sed 's/ /\\ /g' <<< "$line"
    
    Run Code Online (Sandbox Code Playgroud)
  2. 珀尔

    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)
  3. 您还可以使用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)
  4. 如果您在变量中有该行,则可以直接在 bash 中执行此操作:

    echo ${line// /\\ }
    
    Run Code Online (Sandbox Code Playgroud)


Ser*_*nyy 5

还有就是AWK缺少在所有可能的解决方案列表:)

$ echo "Hello World" | awk '{gsub(/ /,"\\ ");print}'                                                                             
Hello\ World
Run Code Online (Sandbox Code Playgroud)