sed com duas condições

4

Eu tenho um arquivo que contém várias linhas.
Eu gostaria de remover as entradas do arquivo que começa com nnn e tem mais de 25 caracteres.

Por enquanto, só posso separar dois sed :

sed '/^nnn/d' input.txt > output.txt
sed '/^.\{25\}./d' input.txt > output.txt

mas esse não é meu objetivo.

Exemplo de entrada:

nnnASDDGfdgdsfndsjfndsjfdfgGHGHGhfhfd
nnnASDDGfdgdsfn
sadbSADSDDFSDFrrrRRRRRRRttTGGGG

Saída desejada:

nnnASDDGfdgdsfn
sadbSADSDDFSDFrrrRRRRRRRttTGGGG
    
por user3626411 06.03.2018 / 12:43

5 respostas

6

sed solução:

sed -E '/^nnn.{23}/d' file
  • /^nnn.{23,}/ - corresponde apenas à linha que começa com nnn e tem mais de 25 caracteres ( .{23,} - corresponde a sequência de caracteres com pelo menos 23 caracteres)
  • d - exclua a linha correspondente

A saída:

nnnASDDGfdgdsfn
sadbSADSDDFSDFrrrRRRRRRRttTGGGG

O mesmo com o comando awk :

awk '!/^nnn.{23}/' file
    
por 06.03.2018 / 12:51
7

Isso é melhor feito por awk :

awk '/^nnn/ && length >= 25 { next } { print }' file

O /^nnn/ corresponderá à expressão regular dada ("linha começa com nnn "). length (ou length($0) ) retornará o comprimento da linha de entrada. Se a expressão corresponder e o comprimento for 25 ou mais, a linha será ignorada, caso contrário, será impressa. O { print } pode ser substituído por apenas 1 se parecer muito longo para digitar.

Ou

awk '!/^nnn/ || length < 25' file

Isso faz a mesma coisa, mas com a condição inversa. Se a linha não corresponder à expressão ou se tiver menos de 25 caracteres, ela será impressa. Outras linhas são ignoradas.

Ambos produzem

nnnASDDGfdgdsfn
sadbSADSDDFSDFrrrRRRRRRRttTGGGG

para os dados de entrada fornecidos.

    
por 06.03.2018 / 12:49
5

Você pode fazer como:

sed -e '/^nnn/!b' -e '/.\{26\}/d'

Ou:

sed '/^nnn/{/.\{26\}/d;}'
    
por 06.03.2018 / 15:19
2

Que tal humilde grep

$ grep -v '^nnn.\{23\}' ip.txt
nnnASDDGfdgdsfn
sadbSADSDDFSDFrrrRRRRRRRttTGGGG

$ # if ERE is available
$ grep -vE '^nnn.{23}' ip.txt
nnnASDDGfdgdsfn
sadbSADSDDFSDFrrrRRRRRRRttTGGGG

-v, --invert-match Invert the sense of matching, to select non-matching lines.

    
por 06.03.2018 / 16:36
2

com grep

grep -v '^nnn.\{23\}' infile
    
por 06.03.2018 / 16:37