sed +パラメーターのコメントを外し、ファイルの値を変更します。

sed +パラメーターのコメントを外し、ファイルの値を変更します。

wal_levelパラメーターのコメントを外して、値を最小からアーカイブに変更したいと思います。

sed / perl one-linerを使用してどうすればこれを行うことができますか?

$ grep wal_level  /var/lib/pgsql/data/postgresql.conf
#wal_level = minimal                    # minimal, archive, or hot_standby

予想される結果:

  wal_level = archive                    # minimal, archive, or hot_standby

「#」にはwal_level複数のスペースを含めることができます。

たとえば、

#     wal_level = minimal   

または

#       wal_level = minimal   

など。

答え1

これは働きます:

sed 's/^ *# *wal_level *= *[^ ]*/wal_level = archive/'

また、コメントの前には空白を 1 つ許可し(万が一の場合に備えて)、他の場所では空白を 0 個以上許可します。またはPerlでは:

perl -pe 's/^\s*#\s*wal_level\s*=\s*\S+/wal_level = archive/' file

答え2

perl -pi.BAK -aF'/(\h*[#=]\h*)/,$_,4' -le '
   $F[4] = "archive";
   $_ = join $,, @F[2..$#F] if /^\h*#\h*wal_level\h*=/;
' /var/lib/pgsql/data/postgresql.conf

行はフィールドで区切られ、区切り文字も@F含まれています。フィールド分割オプションのパラメータ4は、-Fフィールド数を制限します。 3から始まるフィールドはスペースを使用して結合されます。これはこのフィールドのデフォルトです。OFS = $,

答え3

スペースの数wal_levelなど、表示される行全体を変更できます。#

sed '/^# *wal_level/cwal_level = archive' inputfile

関連情報