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/'

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

관련 정보