ユーザーの入力を受け入れ、すべての特殊文字を「\」+文字に置き換えるスクリプト「test.sh」を作成したいと思います。私のスクリプト:
#!/bin/bash
echo 'input='"$1"
arg=`echo "$1" | sed 's:[]\[\^\$\.\*\/]:\\&:g'`
echo 'modified input='"$arg"
私のコマンドは、特殊文字のない文字列 "xy"で動作します。端末で次のコマンドを実行します。
test.sh xy
私は得る:
input=xy
modified input=xy
しかし、これを実行すると、次のようになります。
test.sh x.y
私は得る:
input=x.y
modified input=x&y
このスクリプトがなぜ機能しないのか理解できません。私は次のことを期待しています:
input=x.y
modified input=x\.y
問題はこのsedコマンドにあると思いますが、どこにいるのかわかりません。
sed 's:[]\[\^\$\.\*\/]:\\&:g'
ベストアンサー1
グループを正しくキャプチャしていないようです。この試み?
sed 's:\([]\[\^\$\.\*\/]\):\\\1:g'
編集:気にしないでください。 &の関連性がわかりません。問題は、構文解析とサブシェル渡しのため、代替からスラッシュをさらにエスケープする必要があることです。
sed 's:[]\[\^\$\.\*\/]:\\\\&:g'
また、バックティックの代わりに$(command)を使用すると、追加の\は必要ありません。