パターンを変数に置き換える

パターンを変数に置き換える

$new他の変数に使用して保存したファイルの3行を置き換える必要がある変数には、3行の数字が格納されています。私の考えでは。しかし、エラーが発生します。grep$oldsed "s/$old/$new/g" input > output

sed: 1: "s/\( 28.47969107 0. ...": unterminated substitute pattern

私の入力ファイルは次のとおりです。

scale
 1.000
primitive lattice vectors
    28.47969107  0.00000000  0.00000000
   0.00000000 28.47969107  0.00000000
   0.00000000  0.00000000 28.47969107
grid dimensions
  100 100 100

$oldは善です

28.47969107 0.00000000 0.00000000 0.00000000 28.47969107 0.00000000 0.00000000 0.00000000 28.47969107

$new形式は以前と同じで数字のみが異なります。

ベストアンサー1

sed -e "/$old/i$new" -e "/$old/{N;N;d}" input > output

どこ

  • $old28.47969107最初の行でも最初の行でもかまいません。28.47969107 0.00000000 0.00000000
  • $new形態にならなければならない28.47969107 0.00000000 0.00000000\n0.00000000 28.47969107 0.00000000\n0.00000000 0.00000000 28.47969107

-z変数からエスケープする別の方法(最新のGNU sed(バージョン> 4.2.1)とオプションがある場合):newline

sed -z "s/$(printf "%b" "$old"|sed '$!s/$/\\/')/$(printf "%b" "$new"|sed 's/$/\\/')/" input > output

または、スクリプト割り当て機能で置き換えると

end_esc(){ printf "%b" "$@"|sed '$!s/$/\\/' ; }
sed -z "s/$(end_esc $old)/$(end_esc $new)/" input > output

おすすめ記事