sed:-e式#1、文字1:不明なコマンド: `` ''

sed:-e式#1、文字1:不明なコマンド: `` ''

FILEbashに対応するRT値を 。FILETTT

タスク:

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\nechoprintf
  • あるいは、スラッシュが含まれている場合、デフォルトではスラッシュがコマンド区切りsed文字として使用されるため、コマンドは失敗します。幸い、このコマンドでは別の区切り文字を使用するのが簡単であるため、データに表示されない区切り文字を選択する必要があります。残念ながら、値を正規表現ではなく固定文字列として解釈したい場合は、避けるべきいくつかの異なる部分文字列と文字があります。また、2番目の文字列には部分文字列が含まれていない可能性があります。$source_dir$target_dirs///sedsed$target_string\1\2&

sedこの場合、パラメータ置換を使用するよりもシェル自体でパラメータ置換を使用する方が効率的で安全です。シェルは、シェルパターンに一致するすべての部分文字列を置き換えるbashなどの操作を実行できます(部分文字列の最初の項目のみを置き換えるには単一の置換を使用)。${variable//pattern/word}pattern$variableword///

newfile=${FILE/"$source_dir"/$target_dir}

$source_dirその値をワイルドカードパターンとして使用しないように、二重引用符を使用してください。

関連情報