Linuxでファイルの内容を変更する方法は?

Linuxでファイルの内容を変更する方法は?

[マイ 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つの式にまとめることができます。あなたが望むのは、すべてのケースを1a0またはa 1、次にan x、次にoptionに置き換えることです_64。これは、次の拡張正規表現で表すことができます。

1[01]x(_64)*

[ ]を表すキャラクタークラスしたがって、[01]1または0に一致します。この(foo)*設定はゼロ個以上のインスタンスと一致しますfoo。したがって、文字列(およびなどの重複項目)と空の文字列が(_64)*一致します。これにより、一致がない場合とすべてを一致させることができます。_64_64_64_6411_x6411x

したがって、これを式に組み合わせると、次のような結果がsed得られます。

sed -iE 's/1[01]x(_64)*/12_64/' config*

関連情報