次の内容を含むテキストファイルがあります。
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に似ています。フェロップ