Bash - remove todas as linhas que começam com 'P'

0

Eu tenho um arquivo de texto com cerca de 300 KB. Eu quero remover todas as linhas deste arquivo que começam com a letra "P". Isso é o que eu tenho usado:

> cat file.txt | egrep -v P*

Isso não está sendo enviado para o console. Eu posso usar cat no arquivo sem outros comandos e ele imprime bem. Minha intenção final é:

> cat file.txt | egrep -v P* > new.txt

Nenhum erro aparece, apenas não imprime nada e se eu executar o segundo comando, o novo.txt estará vazio.

edit: Eu devo dizer que estou executando o Windows 7 com o Cygwin instalado.

    
por Yerval Ternus 20.06.2013 / 10:30

2 respostas

2

Tente este comando:

cat file.txt | egrep -v '^P*' > new.txt

Uma alternativa que evita o uso inútil do gato seria:

egrep -v '^P*' file.txt > new.txt

Você precisa colocar aspas em torno de suas expressões regulares no egrep, caso contrário, o bash as expandirá (no seu caso, o * glob se expandirá para cada arquivo no diretório atual, começando com um P maiúsculo).

    
por 20.06.2013 / 10:39
0

P* como regex significa "qualquer número de P s, incluindo 0". Por isso, sempre corresponderá, pois cada linha contém pelo menos 0 P s. Isso explica por que egrep -v P* imprime nada: cada linha corresponde e -v seleciona as linhas que não correspondem. (Na verdade, ele pode fazer outra coisa, pois P* será expandido por bash na lista de arquivos que começam com a letra P no diretório atual, se houver algum. Você deve usar aspas egrep -v "P*" , mas isso não é problema seu.)

Você deseja corresponder um P no início da linha. Então, você precisa especificar que o regex é "ancorado" (corresponde apenas no início), o que você faz colocando um ^ no começo:

grep -v ^P file.txt > new.txt

A propósito, egrep está obsoleto; você deve usar grep -E , mas neste caso não há diferença entre o regex básico e estendido.

grep não usa "globs", ele usa expressões regulares. E isso não força a expressão regular a corresponder à linha inteira; é suficiente se uma string correspondente à expressão regular aparecer em algum lugar na linha.

    
por 20.06.2013 / 18:13