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


8

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

これが私のスクリプトです:

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

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

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

hello\bye

期待される出力:

hello\ bye

少し詳しく説明していただけますか?テキストファイルを変更するスクリプトを探していますか?正確に何を探していますか?
Fabby

tr x ' 'x置き換えたいキャラクターはどこですか?
ドアノブ2015年

更新-例を追加。
ダカ2015年

回答:


17

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. printfandを使用することもできます%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」のすべての出現箇所をバックラッシュ+スペースで置き換えたい場合は機能しません。
ダカ2015年

@sudoman変数に既に行があるので、いくつかのオプションを追加しました。
terdon 2015年

バッシュのprintf組み込みは、同様の機能があるquotemeta- printf '%q\n' "$line"IIRCそれを行う必要があります。
evilsoup 2015年

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.