tr
またはsed
コマンドを使用して、すべてのスペースの前にバックスラッシュを配置するにはどうすればよいですか?
私のスクリプトは次のとおりです。
#!/bin/bash
line="hello bye"
echo $line | tr ' ' "\\\ "
これは、スペースをバックスラッシュに続けてスペースで置き換えることを想定していますが、スペースをバックスラッシュ+スペースではなくバックスラッシュで置き換えるだけです。
これは私が得る出力です:
hello\bye
期待される出力:
hello\ bye
tr
は複数の文字を使用できません。代わりに次のいずれかを使用してください。
sed
echo "$line" | sed 's/ /\\ /g'
または
sed 's/ /\\ /g' <<< "$line"
Perl
echo "$line" | Perl -pe 's/ /\\ /g'
または
Perl -pe 's/ /\\ /g'<<< "$line"
Perlには、quotemeta
と呼ばれる気の利いた関数もあり、文字列内のすべての奇妙なものをエスケープできます。
line='@!#$%^&*() _+"'
Perl -ne 'print quotemeta($_)' <<< $line
上記が印刷されます
\@\!\#\$\%\^\&\*\(\)\ _\+\"\
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
変数に行がある場合は、bashで直接実行できます。
echo ${line// /\\ }
すべての可能なソリューションのリストにAWK
がありません:)
$ echo "Hello World" | awk '{gsub(/ /,"\\ ");print}'
Hello\ World