Como posso excluir uma linha de um arquivo quando a linha contém uma string específica? [duplicado]

0

Eu tenho um arquivo que é separado por vírgula. Eu tenho que encontrar um texto específico e, em seguida, excluir a linha completa.

por exemplo,

123,aaa,bbb,888,8881
124,bbb,ccc,999,8881
125,ccc,ddd,888,8883

Eu tenho que apagar a linha contendo 888.

    
por Mohammad Salik 22.07.2016 / 07:52

3 respostas

3

Usando sed ,

sed '/888/d' filename

Você pode usar a opção -i para editar o arquivo no local como

sed -i.bak '/888/d' filename

Observação: .bak manterá o backup do arquivo original.

Supondo que você quer se livrar das linhas que contém 888 na coluna específica, então você gostaria de usar,

awk -F"," '$4 != "888"' filename
    
por 22.07.2016 / 07:54
0

Usando grep

grep -vw '888' infile.csv > outfile.csv

Se você deseja editar no local,

sed -i.bak '/\b888\b/d' infile.csv

Editar:

Para excluir linhas contendo 888 somente na quarta coluna

sed -i.bak -r '/^(([^,]+,){3})888,/d' infile.csv
    
por 22.07.2016 / 07:58
0

O IMO, usando printf para enviar comandos em ed , é melhor que sed -i .

printf '%s\n' 'g/,888,/d' 'w' | ed -s msalik.txt

O primeiro argumento a printf diz para imprimir cada argumento restante separado por novas linhas ( \n ).

Nenhum dos dois últimos argumentos realmente precisam ser citados. Acabei de citá-los como exemplo - alguns comandos ed precisarão ser citados.

Por que ed é melhor que sed -i ?

Ao contrário de ed , sed -i não faz uma edição verdadeira no local. Ele cria um arquivo de saída temporário e renomeia o original. Isso tem dois efeitos colaterais potencialmente indesejados:

  • As permissões no arquivo podem mudar devido ao umask com o qual o arquivo temporário foi criado. Até mesmo a propriedade ou grupo pode mudar se o script sed -i for executado por um usuário diferente (que tenha acesso RW apropriado ao arquivo e à pasta, é claro).

  • O arquivo de substituição terá um inode diferente. Isso vai quebrar os links físicos.

por 23.07.2016 / 09:27