bashで文字列をエスケープするコマンド


99

文字列をエスケープされるものに変換するbashコマンドが必要です。次に例を示します。

echo "hello\world" | escape | someprog

エスケープコマンドはどこになる"hello\world""hello\\\world"。その後、someprogは"hello\\world"期待どおりに使用できます。もちろん、これは私が実際に行うことの簡単な例です。


5
脱出の性質は何ですか?言い換えると、どの文字をエスケープする必要があるのですか?C ++スタイルのエスケープ(タブが\ t、改行が\ n、引用符が\ "で置き換えられる、など)を探していますか?問題が明確に定義されていないと、解決するのは困難です
Michael Aaron Safyan


この質問は、さまざまなことを意味します。私たちが推測するのではなく、探しているエスケープの種類を正確に述べておくと役立ちます。
ドンハッチ

1
この質問は、\に\を使用することに固有のものでした。受け入れられた答えがあります。
User1

回答:


155

バッシュで:

printf "%q" "hello\world" | someprog

例えば:

printf "%q" "hello\world"
hello\\world

これは変数でも使用できます。

printf -v var "%q\n" "hello\world"
echo "$var"
hello\\world

6
ご注意ください、%q2012年頃まで10年以上壊れていました~。問題がありました。ポータブルsedワンライナーstackoverflow.com/a/20053121/1073695
Jo So

1
ドル記号もエスケープできるため、sedは確かに優れています
2016

2
@untore:a='abc$def":'; printf '%q\n' "$a"結果abc\$def\":(ドル記号はエスケープされます)。これはBash 4.3です(Bash 3.2でも同じ結果が得られました)。どのバージョンを使用していますか?
追って通知があるまで一時停止。

3
ドル記号をエスケープするには、代わりに一重引用符を使用します。例:printf "%q" 'he$l&lo\world'
LeandroCR

bashのprintf '%q\n' text引用はテキストをbashフォーマットで(そして現在のロケールに対して)引用するため、OPの場合に、someprog引用構文がまったく同じbashである可能性が非常に低い場合にのみ機能します。
ステファンChazelas

9

ピュアバッシュ、パラメーター置換を使用:

string="Hello\ world"
echo ${string//\\/\\\\} | someprog

1
このようにして、「hello world」は「hello \ world」にエスケープされません-受け入れられた答えのprintfアプローチはそれを行います。
vchrizz 2016年

1
また、「%q」は「/」をエスケープしません。「03/25/2017」のように「03 \ / 25 \ / 2017」にエスケープする必要がありました(「/」で区切られた通常式)。
wrlee 2017年

0

perlを使用して、さまざまな文字を置き換えることができます。次に例を示します。

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

エスケープの性質によっては、複数の呼び出しをチェーンして適切な文字をエスケープすることができます。


1
なぜsedしないのですか?$ echo "hello \ world" | sed 's / \\ / \\\\ /'
スペース

1
@Octopus、これも有効なオプションです。私はたまたまperlに慣れていますが、そうです、それもうまくいきます。
Michael Aaron Safyan、
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.