perl + ignora linhas com comentários e apaga linhas duplicadas com a palavra de correspondência [closed]

1

Criamos o seguinte forro de Perl. Para excluir linhas duplas, exceto a primeira linha de correspondência, a segunda parte da sintaxe é ignorar as linhas com a observação "#".

Exemplo:

# more /tmp/test

     # abra_kadabra

abra_kadabra
abra_kadabra


# perl -i -ne -e'next if /^#/; next if /abra_kadabra/ && ++$ok > 1; print' /tmp/test


# more /tmp/test

     # abra_kadabra

Na verdade, a sintaxe do Perl não está ignorando as linhas comentadas, apesar de definirmos o next if /^#/1 :

Por favor, avise o que está errado na minha sintaxe?

Saída esperada

# more /tmp/test

     # abra_kadabra

abra_kadabra

Outros exemplos:

# more /tmp/test

     # abra_kadabra
#       abra_kadabra
abra_kadabra 1
abra_kadabra 2
abra_kadabra 3
abra_kadabra 4

Resultado esperado:

# more /tmp/test

     # abra_kadabra
#       abra_kadabra
abra_kadabra 1
    
por yael 20.08.2018 / 14:11

2 respostas

2

next if /^#/; ...; print significa que as linhas que começam com # não serão impressas.

Aqui, você quer

perl -i -ne 'next if !/^\s*#/ && /abra_kadabra/ && $count++; print' /tmp/test

Isso é o que você quer não para chamar next para as linhas comentadas se você quiser preservá-las.

Mesmo com sed para as implementações que suportam -i ( -i '' com FreeBSD e derivados):

sed -i -e '/^[[:space:]]*#/b' -e '/abra_kadabra/!b' -e 'x;/./d;g' /tmp/test

Onde usamos o espaço para lembrar se já vimos abra_kadabra antes.

    
por 20.08.2018 / 14:26
0

Você ancorou o # para corresponder apenas no início de uma linha. Se você quiser pular todas as linhas que começam com '#', mesmo depois de liderar os espaços em branco, é necessário:

next if /^\s*#/

Isso irá pular linhas com espaço em branco principal opcional seguido por # .

    
por 20.08.2018 / 14:25

Tags