Exclui strings correspondentes a vários padrões de uma lista

0

Eu tenho um arquivo com linhas:

1
apple
2
orange
3
banana
4
mango
5
coconut

Eu tenho uma lista de padrões:

1
3
5

Eu quero excluir as linhas (e uma linha adicional depois) usando a lista de padrões, para obter:

2
orange
4
mango

Como tenho um grande número de padrões que não consegui digitar manualmente um por um em um único comando, uma lista deve ser usada.

    
por Johnny Tam 13.07.2017 / 10:37

3 respostas

0

sed + solução colar :

sed -E "/\<('paste -s -d'|' patterns')\>/{N;d;}" file

A saída:

2
orange
4
mango
  • paste -s -d'|' patterns - mescla as linhas do arquivo patterns usando | como um dilimidor para obter o grupo de alternância regex (1|3|5)

  • N - acrescente a próxima linha ao espaço padrão

  • d - exclua linhas de espaço padrão

por 13.07.2017 / 11:56
0

Vamos fazer algumas malabarismos com a opção grep :

Você pode usar grep para todas as linhas do seu arquivo de frutas, exceto para aquelas no seu arquivo de lista com números a serem excluídos:

grep -v -x -f numbers fruits

( -f para fornecer um arquivo padrão, -x para evitar correspondências parciais e -v para inverter a correspondência)

Infelizmente, os números e as frutas estão em linhas separadas, então as frutas sobrevivem ao grep. Vamos nos livrar deles com um padrão -e adicional:

grep -v -x -e "[a-z]*" -f numbers fruits

Agora, todas as linhas que consistem em apenas letras são removidas, portanto, não há mais frutas, nem mesmo as desejadas. Mas podemos recuperá-los do contexto:

grep -v -x -A1 -e "[a-z]*" -f numbers fruits

( -A1 dá uma linha adicional após cada partida) finalmente dá o que você queria.

    
por 13.07.2017 / 11:10
0

Tente isso.

O pattern_file tem todos os seus patterns e o restante conteúdo em file_content . Aqui eu tentei grep com a opção -A 1 , que pode mudar dependendo do número de linhas após a correspondência de patter.

#!/bin/bash

while read pattern 
do
        for line_num in 'grep $pattern file_content -A 1 -n | awk -F":|-" '{print $1}' | paste -sd ","'
        do
                sed -i "${line_num}d" file_content
        done
done < pattern_file
    
por 13.07.2017 / 13:25