web-dev-qa-db-ja.com

すべてのスペースの前にバックスラッシュを追加するにはどうすればよいですか?

trまたはsedコマンドを使用して、すべてのスペースの前にバックスラッシュを配置するにはどうすればよいですか?

私のスクリプトは次のとおりです。

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

これは、スペースをバックスラッシュに続けてスペースで置き換えることを想定していますが、スペースをバックスラッシュ+スペースではなくバックスラッシュで置き換えるだけです。

これは私が得る出力です:

hello\bye

期待される出力:

hello\ bye
7
daka

trは複数の文字を使用できません。代わりに次のいずれかを使用してください。

  1. sed

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

    または

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

    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と同様に、スペースだけでなくall特殊文字をエスケープすることに注意してください。

    printf "%q\n" <<<$line
    
  4. 変数に行がある場合は、bashで直接実行できます。

    echo ${line// /\\ }
    
14
terdon

すべての可能なソリューションのリストにAWKがありません:)

$ echo "Hello World" | awk '{gsub(/ /,"\\ ");print}'                                                                             
Hello\ World
4