sed + un-comment parâmetro e valor de mudança no arquivo

1

Eu quero descomentar o parâmetro wal_level e mudar o valor de minimal para archive

como executar esta ação por sed / perl one-liner?

$ grep wal_level  /var/lib/pgsql/data/postgresql.conf
#wal_level = minimal                    # minimal, archive, or hot_standby

resultados esperados:

  wal_level = archive                    # minimal, archive, or hot_standby

Observe que wal_level pode ser um par de espaços do "#".

Por exemplo:

#     wal_level = minimal   

ou

#       wal_level = minimal   

    
por yael 01.08.2017 / 13:26

3 respostas

1
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

A linha é dividida nos campos @F e os delimitadores são incluídos também. O parâmetro 4 na opção de divisão de campo -F restringirá o número de campos para isso. Os campos a partir do terceiro são unidos usando espaço vazio, que é o valor padrão do OFS = $,

    
por 01.08.2017 / 15:04
1

Você pode apenas alterar a linha inteira em que wal_level aparece, incluindo # e um número arbitrário de espaços em branco:

sed '/^# *wal_level/cwal_level = archive' inputfile
    
por 01.08.2017 / 13:32
1

Isso deve funcionar:

sed 's/^ *# *wal_level *= *[^ ]*/wal_level = archive/'

Eu também permito um espaço antes do comentário (apenas no caso) e 0 ou mais espaços em qualquer outro lugar. Alternativamente, em perl:

perl -pe 's/^\s*#\s*wal_level\s*=\s*\S+/wal_level = archive/' file
    
por 01.08.2017 / 13:39