sed 変数には / が含まれます。

sed 変数には / が含まれます。

次の内容を含むテキストファイルがあります。

some content  
replace content  
other content

次のようないくつかの変数があります。

PATH="/path/to/scriptdir"
PARAMETERS="para1 para2"
FILETOCHANGE="/foo/bar"

次に、次から始まるテキストファイルの内容を変更したいと思います。変える、変数の内容そしてパラメータ。交換後、テキストファイルは次のようになります。

some content
/path/to/scriptdir/script para1 para2
other content

私はいくつかのsedコマンドを試しましたが、エラーが発生し続けます。例えば

sed -i "s/^replace.*$/$PATH/script $PARAMETERS/g" $FILETOCHANGE
sed: -e expression #1, char 12: unknown option to `s'

または

sed -i "s|^replace.*$|$PATH/script $PARAMETERS|g" $FILETOCHANGE
sed: -e expression #1, char 58: unterminated `s' command

何が間違っているのか教えてもらえますか?

答え1

(1)するいいえPATHこれには変数を使用します。シェルには特別な意味があります。私はSCRIPTDIRここで選択します:

SCRIPTDIR="/path/to/scriptdir"
PARAMETERS="para1 para2"
FILETOCHANGE="/foo/bar"

/(2)sedの代替コマンドにはスラッシュ()は必要ありません。s#this#that#それ以外の場合、s|this|that|効果は同じですs/this/that/g。 Sedは、s残りの(代替)コマンドの区切り文字に続くs文字のみを使用します。これにより、パターンと置換文字列のスラッシュ関連の問題を回避できます。|たとえば、区切り文字として使用すると、スラッシュはsedに特別な意味がありません。

したがって、次のように動作します。

sed "s%^replace.*$%$SCRIPTDIR/script $PARAMETERS%g" $FILETOCHANGE

答え2

最終的な解決策はsedからPerlに切り替えることでした。 Perl は、変数をシェルのようにマクロ拡張ではなく一流の市民として扱います。

path=/path/to/scriptdir parameters="para1 para2" perl -i~ -pe \
    's|^replace.*$|$ENV{path}/script $ENV{parameters}|g' -- "$filetochange"
  • -p入力した内容を1行ずつ読み、処理後に各行を印刷します。
  • ハッシュには%ENVコマンドの先頭に割り当てられた環境変数が含まれており、その変数をコマンドにエクスポートできます。
  • s///(必要に応じて区切り文字を変更してください。) sedに似ています。フェロップ

関連情報