FILE
bashに対応するRT
値を 。FILE
TTT
タスク:
FILE="BlazeRT 123"
source_dir=BlazeRT
target_dir=BlazeTTT
newfile="$(echo ${FILE} | sed -e \"s/${source_dir}/${target_dir}/g\")"
エラーが発生します。
sed: -e expression #1, char 1: unknown command: `"'
shell evalを実行するとエラーが発生しているようですecho ${FILE} | sed -e \"s/${source_dir}/${target_dir}/g\"
。
さて、最後のコマンドを修正する方法を知りたいです。
よろしくお願いします!
答え1
実行したいコードには約4つの問題があります。
- 式の周りに二重引用符文字をエスケープしています
sed
。これにより、sed
実行したい式の二重引用符部分が作成されます。には"
コマンドがないので、sed
ユーティリティは「不明なコマンド」と文句を言います。二重引用符をエスケープしないと、この問題を解決できます。 $FILE
引用符なしで使用してください。したがって、シェルは値を文字(デフォルトではスペース、タブ、および改行)で分割し、結果の単語に対して$IFS
ファイル名を生成します。二重引用符拡張機能を使用して$FILE
これを変更できます。- 場合によっては、ユーティリティは
echo
エスケープシーケンスを展開して出力するデータを変更します(出力する文字列に表示される場合など)。したがって、出力する内容を確認するには、静的文字列にのみ使用する必要があります。他のすべてのケースでは。\t
\n
echo
printf
- あるいは、スラッシュが含まれている場合、デフォルトではスラッシュがコマンド区切り
sed
文字として使用されるため、コマンドは失敗します。幸い、このコマンドでは別の区切り文字を使用するのが簡単であるため、データに表示されない区切り文字を選択する必要があります。残念ながら、値を正規表現ではなく固定文字列として解釈したい場合は、避けるべきいくつかの異なる部分文字列と文字があります。また、2番目の文字列には部分文字列が含まれていない可能性があります。$source_dir
$target_dir
s///
sed
sed
$target_string
\1
\2
&
sed
この場合、パラメータ置換を使用するよりもシェル自体でパラメータ置換を使用する方が効率的で安全です。シェルは、シェルパターンに一致するすべての部分文字列を置き換えるbash
などの操作を実行できます(部分文字列の最初の項目のみを置き換えるには単一の置換を使用)。${variable//pattern/word}
pattern
$variable
word
/
//
newfile=${FILE/"$source_dir"/$target_dir}
$source_dir
その値をワイルドカードパターンとして使用しないように、二重引用符を使用してください。