Como comentar uma linha baseada na palavra com a qual começa?

2

conteúdo do arquivo de amostra:

--------------------
NETWORKING=yes
HOSTNAME=wls1.ebs-testsrvrs.com
# oracle-rdbms-server-12cR1-preinstall : Add NOZEROCONF=yes
NOZEROCONF=yes
--------------------

Eu quero comentar todas as linhas que começam com "HOST"

    
por Girish Sunkara 12.01.2017 / 08:35

5 respostas

6

Em vi :

:%s/^HOST/#&/

ou

:g/^HOST/s/^/#/

O % no primeiro comando significa "em todo o buffer" e é uma forma breve de dizer 1,$ , ou seja, da primeira linha até a última. & na parte de substituição da substituição será substituído pelo texto inteiro correspondido pelo padrão ( ^HOST ).

O segundo comando aplica a substituição ( s ) a todas as linhas correspondentes a ^HOST usando o comando global ( g ), que vi herdou do editor de linha ed . No segundo caso, apenas inserimos # no início da linha ( ^ ).

com sed :

sed 's/^HOST/#&/' input >output

ou

sed '/^HOST/s/^/#/' input >output

da mesma maneira que em vi ( sed sempre aplica todos os comandos a todas as linhas do fluxo de entrada, por isso não usamos nada como % ou g explicitamente com sed ).

    
por 12.01.2017 / 09:33
3

Use sed com a opção -i para editar o arquivo no lugar. (Uma cópia de backup do original será salva como file.txt.bak ). sed -i.bak 's/^\(HOST.*\)/#/g' file.txt

Para ler a parte da expressão regular: O ^ corresponde ao início da linha.

O () pega o texto correspondente em uma variável interna temporária ( ).

O \ é necessário antes dos caracteres ( , pois seu shell os roubará de outra forma.

O .* corresponde a 0 ou mais caracteres.

Assim, a partir da frente da linha, corresponde à string HOST seguida por qualquer texto, até a nova linha. Se a linha não corresponder, deixe-a como está. Se corresponder, o # imprimirá # seguido do texto entre () .

    
por 12.01.2017 / 08:49
2

Fazer através de awk da seguinte forma:

awk '{if($0 ~ /^HOST/){print "#"$0}else{print $0}}' file > file.conf

awk lerá os dados do seu arquivo, se a linha começar com HOST , a linha será impressa com # no começo, senão será impressa como está.

> para salvar as saídas em file.conf

    
por 12.01.2017 / 09:57
2

Perl one liner:

perl -pe 's/^HOST/#$&/' file

Ou para editar o arquivo:

perl -i -pe 's/^HOST/#$&/' file

Explicação

O -pe significa p rint cada linha de entrada depois de aplicar o script fornecido por -e . O s/foo/bar/ é o operador de substituição e substituirá a primeira instância de foo por bar em cada linha. Aqui, estamos substituindo as linhas que começam com HOST ( ^ significa o início da linha) com # e o que foi correspondido ( $& é uma variável especial que armazena o que foi correspondido). Então, substituímos HOST por #HOST .

    
por 12.01.2017 / 11:25
1

perl one-liner:

$ perl -ne 'if(/^HOST/){print "#$_"} else { print}' input.txt                                  
--------------------
NETWORKING=yes
#HOSTNAME=wls1.ebs-testsrvrs.com
# oracle-rdbms-server-12cR1-preinstall : Add NOZEROCONF=yes
NOZEROCONF=yes
--------------------

Esse simples one-liner itera em todas as linhas, verificando se a linha começa com HOST e anexando # a ele, caso contrário, vamos para else statement, que simplesmente imprime a linha inalterada.

A versão em Python da mesma coisa seria a seguinte:

python -c "import sys;print '\n'.join([ '#' + l.strip() if l.startswith('HOST') else l.strip()  for l in sys.stdin  ])" < input.txt

No entanto, isso funciona de maneira ligeiramente diferente, construindo uma lista (ou array) de linhas, inserindo a própria linha condicionalmente ou a linha com # anexada. Por fim, o array é unido a uma string grande com itens separados por novas linhas e impressos.

    
por 12.01.2017 / 09:24

Tags