Como encontrar linhas que correspondam a um padrão e excluí-las?

13

Em um arquivo com muitas linhas, quero excluir as linhas que começam com HERE IT IS .

Como posso fazer isso usando apenas ferramentas de linha de comando?

    
por micgeronimo 19.02.2015 / 10:20

7 respostas

27

Experimente sed :

sed -i '/^HERE IT IS/d' <file>

AVISO: é melhor fazer um backup ao usar a opção -i de sed :

sed -i.bak '/^HERE IT IS/d' <file>

O arquivo original permanecerá como <file>.bak e o arquivo modificado será <file> .

    
por heemayl 19.02.2015 / 10:28
16

Além das muito boas respostas grep e sed que você recebeu, aqui estão algumas outras ferramentas que podem fazer a mesma coisa:

  • Algumas formas de Perl:

    perl -ne '/^HERE IT IS/ || print' file > newfile
    perl -ne 'print if !/^HERE IT IS/' file > newfile
    perl -ne 'print unless /^HERE IT IS/' file > newfile
    

    Você pode adicionar a opção -i a qualquer um dos exemplos para editar o arquivo:

    perl -i.bak -ne '/^HERE IT IS/ || print' file        
    
  • (g) awk

    awk '!/^HERE IT IS/' file > newfile
    

    Versões mais recentes (4.1.1 e posteriores) do GNU awk (o padrão awk no Linux) também podem editar o arquivo:

    gawk -i inplace  '!/^HERE IT IS/' file
    
  • Shell ( bash , zsh , ksh , provavelmente outros). Isso é meio bobo, mas pode ser feito, mas outras ferramentas são melhores.

    while IFS= read -r line; do 
      [[ $line =~ ^"HERE IT IS" ]] || printf "%s\n" "$line"
    done < file > newfile
    
por terdon 19.02.2015 / 15:56
13

Eu usaria grep para filtrá-los. Por exemplo:

grep -v "^HERE IT IS" infile > outfile

Em seguida, transfira o arquivo para o arquivo.

    
por Ben Hills 19.02.2015 / 10:23
5

sed é definitivamente o caminho a percorrer.

Esta ligeira modificação do comando @heemayl deu a você deletar a linha se o mesmo case é usado no padrão ou não, devido ao I na referência do padrão.

sed -i '/HERE IT IS/Id' <file>

Se você tivesse vários arquivos em um diretório em que você queria fazer isso, você poderia combiná-lo com o find assim.

find . -maxdepth 1 -type f -exec sed -i.bak '/HERE IT IS/Id' {} +

A opção maxdepth significa que isso não será usado em diretórios.

    
por Arronical 19.02.2015 / 11:01
4

Outra opção em python:

#!/usr/bin/env python3
[print(l, end = "") for l in open(f).readlines() if not l.startswith("HERE IT IS")]

Onde f é o caminho para o arquivo, entre aspas.

    
por Jacob Vlijm 20.02.2015 / 13:43
4

Grep

grep -P '^(?!HERE IT IS)' file

(?!HERE IT IS) asserção lookahead negativa que faz com que o mecanismo regex corresponda a todos os limites de partida da linha ( que normalmente é igual a ^ ) somente se não for seguido pela string HERE IT IS

python

#!/usr/bin/python3
import sys
fil = sys.argv[1]
with open(fil) as f:
    for line in f:
        if not line.startswith('HERE IT IS'):
            print(line, end="")

Salve o script em um arquivo, diga script.py e, em seguida, execute-o pelo comando abaixo no terminal.

python3 script.py infile
    
por Avinash Raj 20.02.2015 / 13:35
1

Você pode usar o Vim no modo Ex:

ex -sc 'g/^HERE IT IS/d' -cx file
  1. g pesquisa global

  2. d delete

  3. x salvar e fechar

por Steven Penny 16.04.2016 / 21:11