Bash でエスケープする必要のある文字の包括的なリストはありますか? だけで確認できますかsed
?
特に、%
エスケープする必要があるかどうかを確認していました。
echo "h%h" | sed 's/%/i/g'
エスケープしなくても正常に動作しました%
。 をエスケープする必要がないという意味ですか%
? これは必要性を確認する良い方法でしたか?
さらに一般的に言うと、これらはshell
とでエスケープする同じ文字ですかbash
?
ベストアンサー1
sh
だけでなくでも機能する、簡単で安全なルールが 2 つありますbash
。
1. 文字列全体を一重引用符で囲む
これは、単一引用符自体を除くすべての文字に有効です。単一引用符をエスケープするには、その前の引用符を閉じ、単一引用符を挿入して、引用符を再度開きます。
'I'\''m a s@fe $tring which ends in newline
'
sed コマンド:sed -e "s/'/'\\\\''/g; 1s/^/'/; \$s/\$/'/"
2. すべての文字をバックスラッシュでエスケープする
これは改行を除くすべての文字に有効です。改行文字にはシングルクォートまたはダブルクォートを使用します。空の文字列は引き続き処理する必要があります。""
\I\'\m\ \a\ \s\@\f\e\ \$\t\r\i\n\g\ \w\h\i\c\h\ \e\n\d\s\ \i\n\ \n\e\w\l\i\n\e"
"
sed コマンド: sed -e 's/./\\&/g; 1{$s/^$/""/}; 1!s/^/"/; $!s/$/"/'
.
2b. 2のより読みやすいバージョン
のような簡単な安全な文字セットがあり[a-zA-Z0-9,._+:@%/-]
、読みやすくするためにエスケープせずに残すことができます。
I\'m\ a\ s@fe\ \$tring\ which\ ends\ in\ newline"
"
sed コマンド: LC_ALL=C sed -e 's/[^a-zA-Z0-9,._+@%/-]/\\&/g; 1{$s/^$/""/}; 1!s/^/"/; $!s/$/"/'
.
sed プログラムでは、入力の最後の行が改行バイトで終了するかどうかはわかりません (空の場合を除く)。そのため、上記の sed コマンドは両方とも、改行バイトで終了しないと想定しています。引用符で囲まれた改行を手動で追加できます。
シェル変数は、POSIX の意味でのテキストに対してのみ定義されていることに注意してください。バイナリ データの処理は定義されていません。重要な実装では、バイナリは NUL バイトを除いて機能します (変数は C 文字列で実装されており、C 文字列、つまりプログラム引数として使用することを意図しているため)。ただし、latin1 などの「バイナリ」ロケールに切り替える必要があります。
(POSIX仕様を読めば簡単にルールを検証できますsh
。bashの場合は、参考マニュアル@AustinPhillips によってリンクされています)