Excluindo linhas contendo uma variável

5

Eu tenho um arquivo de texto, que contém nomes. Gostaria que meu programa pudesse excluir nomes para os quais eu digo.

Primeiro, descobri que poderia fazê-lo com sed , mas isso não funciona para mim.

deletename é minha variável que conterá o padrão que desejo usar para a pesquisa e test.txt é meu arquivo de texto.

Estou usando:

deletename=0; read deletename; sed...

Eu tentei:

sed "/$deletename/ d" test.txt
sed "/$deletename/d" test.txt
sed '/$deletename/ d' test.txt
sed '/$deletename/d' test.txt    
sed -e "/$deletename/ d" test.txt    
sed -e "/$deletename/d" test.txt
sed -e '/$deletename/ d' test.txt
sed -e '/$deletename/d' test.txt
sed -r "/$deletename/ d" test.txt
sed -r "/$deletename/d" test.txt
sed -r '/$deletename/ d' test.txt
sed -r '/$deletename/d' test.txt

Como nada disso funcionou, tive uma idéia, para verificar o número da linha que tinha o padrão e excluir essa linha. Eu sei que deveria estar usando grep , mas não tenho absolutamente nenhuma ideia de como usá-lo.

Eu tentei algo assim, mas não funcionou:

lineno='expr grep -n $deletename test.txt'

Alguém poderia ajudar? Com sed ou grep , não me importa realmente.

    
por znst 21.11.2016 / 20:44

2 respostas

4

Se você quiser usar read para passar os nomes e quiser excluir linhas que contenham os nomes:

read deletename; sed "/$deletename/d" test.txt

então pressione enter e read espera que você digite algo, então digite o que você quer que seja deletename , por exemplo 0 , então pressione enter novamente e o comando sed é executado. O conteúdo de test.txt aparecerá no terminal, mas todas as linhas que contiverem 0 , ou o que você digitou, serão excluídas do fluxo (NÃO do arquivo)

Se você quiser excluir apenas os nomes, é assim:

read deletename; sed "s/$deletename//g" test.txt

Se você digitar 0 , todas as instâncias de 0 serão excluídas.

Você pode redirecionar (ou tee ) a saída para um novo arquivo, ou se você quiser modificar o arquivo no local , use o sinalizador -i (após o teste)

read deletename; sed -i "/$deletename/d" test.txt

Neste caso, você não verá saída; as alterações serão gravadas no arquivo em vez de serem exibidas no terminal (no STDOUT).

Você precisa usar aspas duplas para permitir a expansão de parâmetro, já que as aspas simples irão suprimi-lo. mas a maneira mais correta, eu acho, embora não seja necessário neste caso simples, usar aspas simples em torno das outras partes da expressão e citar a variável normalmente:

sed 's/'"$deletename"'//g' test.txt
    
por Zanna 21.11.2016 / 22:30
3

Filtrar linhas é o principal papel de grep . Use a opção -v para inverter a correspondência, ou seja, mostrando apenas as linhas que não contêm texto. Então você pode usar o seguinte comando:

read deletename; grep -v $deletename test.txt
    
por Jim 29.11.2016 / 18:59