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


8

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

这是我的脚本:

#!/bin/bash
line="hello bye"
echo $line | tr ' ' "\\\ "

应该用一个反斜杠替换一个空格,然后再一个空格,但这只是用一个反斜杠而不是反斜杠+空格来替换空格。

这是我得到的输出:

hello\bye

预期产量:

hello\ bye

您能详细说明一下吗?您是否正在寻找可更改文本文件的脚本?您到底在找什么?
Fabby 2015年

tr x ' 'x您要替换的字符在哪里?
门把手2015年

已更新-添加了示例。
达卡

Answers:


17

tr不能做多个字符。使用以下方法之一:

  1. sed

    echo "$line" | sed 's/ /\\ /g' 
    

    要么

    sed 's/ /\\ /g' <<< "$line"
    
  2. 佩尔

    echo "$line" | perl -pe 's/ /\\ /g'  
    

    要么

    perl -pe 's/ /\\ /g'<<< "$line"
    

    Perl也有一个漂亮的函数quotemeta,可以将字符串中的所有奇数转义:

    line='@!#$%^&*() _+"'
    perl -ne 'print quotemeta($_)' <<< $line
    

    上面会打印

    \@\!\#\$\%\^\&\*\(\)\ _\+\"\
    
  3. 您还可以使用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
    
  4. 如果行中有变量,则可以直接在bash中执行:

    echo ${line// /\\ }
    

是的,这是可行的,但是在想要用反冲+空格替换所有出现的“ a”时无效。
达卡

@sudoman我添加了更多选项,因为您已经在变量中添加了该行。
terdon 2015年

bash的printf内建有类似的功能quotemeta- printf '%q\n' "$line"要做到这一点IIRC。
evilsoup

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.