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   

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

相关内容