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/'
또한 주석 앞에는 공백을 하나 허용하고(만일의 경우를 대비하여) 다른 곳에서는 공백을 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