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