Imprime todas as linhas que não contenham pontuação

8

Eu quero um padrão de expressão regular que possa imprimir todas as linhas que não contenham pontuação:

Entrada:

.This is line 1
This is ! line 2
This is line (3)
This is line 4

Resultado: (deve ser)

This is line 4

O que eu tentei até agora:

grep '[^[:punct:]]' file.txt

Mas mostra todos os caracteres que não são pontuação.

    
por Hamed Kamrava 03.07.2014 / 15:42

3 respostas

11

Seu grep imprime todas as linhas que contêm caracteres que não são de pontuação. Não é o mesmo que imprimir todas as linhas que não contenham caracteres de pontuação.

Para o último, você deseja a opção -v (linhas de impressão que não correspondem ao padrão):

grep -v '[[:punct:]]' file.txt

Se, por algum motivo, você não quiser usar a opção -v , verifique se a linha inteira é composta por caracteres que não são de pontuação:

grep '^[^[:punct:]]\+$' file.txt
    
por 03.07.2014 / 15:44
1

No sed você pode fazer algo como:

sed '/[[:punct:]]/!d'

No awk você pode fazer:

awk '!/[[:punct:]]/'

    
por 03.07.2014 / 17:09
1

A Perl ones:

perl -nle 'print unless /\p{XPosixPunct}/' file

Isso corresponderá a -! "# $% & '() * +,. /:; < = >? @ [\] ^ _' {|} ~ que unicode considere pontuações e símbolos.

ou:

perl -nle 'print unless /\p{Punct}/' file

\p{Punct} corresponde apenas a -! "#% & '() *,. /:;? @ [\] _ {} , em falta $ + < = & gt ; ^ '| ~ que unicode considera os símbolos.

perl por padrão usa o código do idioma POSIX. Se você não usar perl , todos deverão definir LC_ALL=POSIX , porque localidades diferentes podem ter caracteres de pontuação diferentes, como SAA C tem ¢ .

    
por 03.07.2014 / 17:51