Como excluir linhas específicas de um arquivo txt

3

Eu tenho um script Bash que grava dados em um arquivo de log, depois eu pego o material que quero usando o comando sed . Isso me dá um arquivo data.txt . O que eu quero saber é como eu vou sobre a exclusão de linha específica dentro desse arquivo data.txt .

Por exemplo:

123
456
789

Eu quero remover a segunda linha, contendo 456 para que eu tenha apenas

123

789

Eu tentei com sed '2d' data.txt , mas não funciona.

Eu uso este comando para criar data.txt de log.log :

sed -nE '1s/.{1}(.{2}).*//p;' log.log >> data.txt
    
por Insanebench420 04.01.2018 / 13:05

4 respostas

6

Tente isso. Isso deve funcionar.

sed -i '2d' data.txt

Você precisa adicionar -i flag com o comando sed, a menos que esteja redirecionando sua saída para um novo arquivo. Se você não adicionar o -i flag, o sed irá imprimir o espaço padrão para STDOUT e não fará nenhuma alteração no arquivo original.

Opção de backup automático

É muito perigoso modificar um arquivo sem fazer um backup adequado. Portanto, o sed tem seu método nativo para fazer backup de um arquivo antes de editá-lo, o que é a opção -i.bak .

Portanto, no exemplo acima, se usarmos a opção de backup, o comando seria.

sed -i.bak '2d' data.txt

Portanto, ele removerá a primeira linha do arquivo data.txt e também fará uma cópia de backup do arquivo original com a extensão .bak .

    
por ran 04.01.2018 / 13:24
3

Usando awk :

awk 'NR!=2{ print }' input-file > output-file

Isso pode ser lido como: se o número de registros não for igual a 2, imprima o registro (linha). Se você quiser excluir a segunda e a terceira linha:

awk 'NR!=2 && NR!=3 { print }' input-file

Se você quiser ter uma linha vazia como é mostrada na pergunta, o comando sed deve ficar assim:

 sed '2 s/^.*$//' input-file

O primeiro caractere 2 é o número da linha, seguido pelo comando s , que substituirá todos os caracteres .* do início ^ até o final $ da linha com string vazia %código%. Neste caso, os caracteres inicial e final podem ser omitidos.

Exemplo:

$ cat input-file
123
456
789
654

$ sed '2,3 s/.*//' input-file
123


654
    
por pa4080 04.01.2018 / 13:20
3

Você sabe, além de especificar por número de linha, também é possível fazer isso combinando o conteúdo da linha, se isso for mais útil (o que parece ser possível):

sed -i '/^456$/d' data.txt
    
por JoL 04.01.2018 / 20:22
2

Este comando irá deletar as linhas 2-4 e 6

sed -e '2,4d;6d' file
    
por Petr 04.01.2018 / 13:13