たとえば、一重引用符を含む変数がありa'b
、ファイルを書き込む前に2つの一重引用符で置き換える必要がありますa''b
。
次のbashコードは私のために仕事をするために使用されます...
line="a'b"
echo "${line//\'/\'\'}" > out.txt
...今日まで、使用されているbashのバージョンによって異なる出力が見つかりました。
- GNU bash、バージョン 4.3.48(1)-リリース(x86_64-pc-linux-gnu):
a''b
- GNU bash、バージョン 4.2.46(2)-リリース(x86_64-redhat-linux-gnu):
a\'\'b
上記の行をさまざまな方法で修正しましたが、両方のa''b
bashシェルで同じ出力を生成することはできません。
echo
結局、との組み合わせを使うようになりましたsed
。
echo "$(echo $line | sed "s/'/''/g")" > out.txt
しかし、タスクを実行するために、より簡潔で純粋なbash表現を使用できるかどうかを知りたいです。できますか?
答え1
の一つ多様性bash-4.3-alphaと以前のバージョンbash-4.2-releaseの間:
パターン置換語拡張を使用すると、bash は文字列内の引用符をエスケープ文字として機能させることができるようになり、引用符を削除して置換文字列を実行します。これは以前のバージョンと互換性がないため、bash互換モードを4.2に設定して無効にすることができます。
入力する:
BASH_COMPAT=4.2
line="a'b"
echo "${line//\'/''}"
出力:
a''b
答え2
バージョン(およびそれをサポートするksh93、およびそれをサポートするmkshやzshなどのシェル実装)に関係なく動作する方法の場合、パターンと置換を変数に保存できます。
pattern="'"
replacement="''"
printf '%s\n' "${line//$pattern/$replacement}"
または
q="'"
printf '%s\n' "${line//$q/$q$q}"
(他のシェルではzsh
固定$pattern
文字列として扱われます。ワイルドカードパターンとして処理するには(ワイルドカードが含まれていないためここには適用されません)$pattern
。 。$pattern
$~pattern
$pattern
${line//"$pattern"/$replacement}