我想取消注释 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
ETC。
答案1
这应该有效:
sed 's/^ *# *wal_level *= *[^ ]*/wal_level = archive/'
我还允许在注释前留有一个空格(以防万一),并在其他地方留有 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