[マイ Linux] ボックスには、カスタムアプリケーションの構成情報を含む 3 つの構成ファイルがあります。設定ファイルのいくつかの値を変更したいと思います。ファイルの内容と説明は次のとおりです。
config1ファイルの内容:
set VAR1=/app/client/10x_64/instance
構成2ファイルの内容:
set VAR2=/app/client/11x/instance
config3ファイルの内容:
set VAR3=/app/client/11x_64/instance
すべてのファイルのすべての値を10x_64、11x、11x_64から12x_64に変更したいと思います。現在の内容を変更するには、次の3つのコマンドを使用します。
sed -i 's/10x_64/12x_64/g' config1
sed -i 's/11x/12x_64/g' config2
sed -i 's/11x_64/12x_64/g' config3
3つのファイルの内容をすべて変更する共通コマンドが必要です。
答え1
単一の式が必要な場合は、次のようにできます。
sed -i 's#/client/[^/]*#/client/12x_64#g' config*
私は/client/[^/]*
タグを使用して置き換えたいアイテム(つまり、次のアイテムの/client/
後と前のアイテム)を探していますが、ファイル内/
の他のアイテムの一致を避ければこれを行うことができます。client/[^/]*/instance
答え2
次のように簡単に組み合わせることができます。
sed -i 's/10x_64/12x_64/g;s/11x/12x_64/g;s/11x_64/12x_64/g' config*
答え3
特定のバージョンに必要な構成部分を置き換える「テンプレート構成ファイル」をどのように準備しますか?次のテンプレートがあるとしましょう。
#/bin/bash
echo "set ##V1##=/app/client/##ARCH1##/instance" > cfg-file1
echo "set ##V2##=/app/client/##ARCH2##/instance" > cfg-file1
echo "set ##V3##=/app/client/##ARCH3##/instance" > cfg-file1
その後、コマンドライン引数に基づいてバージョンごとに置換コマンドを実行できます。
#!/bin/bash
[ $# -lt 1 ] && (echo "usage: replace <version>"; exit 1;)
if [ "$1" == "1" ]; then
cat template.txt | sed -e "s/##V1##/VAR1/g;s/##ARCH1##/arch_xy_/g;s/##V2##/VAR2/g;s/##ARCH2##/arch2_xy_/g;"
# etc...
fi
これは簡単に拡張できます。
答え4
3つのコマンドをすべて1つの式にまとめることができます。あなたが望むのは、すべてのケースを1
a0
またはa 1
、次にan x
、次にoptionに置き換えることです_64
。これは、次の拡張正規表現で表すことができます。
1[01]x(_64)*
[ ]
を表すキャラクタークラスしたがって、[01]
1または0に一致します。この(foo)*
設定はゼロ個以上のインスタンスと一致しますfoo
。したがって、文字列(およびなどの重複項目)と空の文字列が(_64)*
一致します。これにより、一致がない場合とすべてを一致させることができます。_64
_64_64_64
11_x64
11x
したがって、これを式に組み合わせると、次のような結果がsed
得られます。
sed -iE 's/1[01]x(_64)*/12_64/' config*