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

8

Eu quero um padrão regex que pode 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

Saída: (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.

Hamed Kamrava
fonte

Respostas:

11

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

Para o último, você deseja a -vopção (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 -vopção, verifique se a linha inteira consiste em caracteres sem pontuação:

grep '^[^[:punct:]]\+$' file.txt
Joseph R.
fonte
+1 obrigado. Existe alguma maneira sem usar o -vswitch?
27680 Hamed Kamrava
@HamedKamrava Yes. Por favor, veja minha edição.
Joseph R.
@HamedKamrava Por curiosidade: por que você quer evitar -v?
Bernhard
Eu não evitar -vapenas quer saber mais :)
Hamed Kamrava
@HamedKamrava Por favor, não esqueça de marcar esta resposta como 'Aceita' se resolver o seu problema.
Joseph R.
1

No sed, você pode fazer algo como:

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

No awk você pode fazer:

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

ryekayo
fonte
1

Uns Perl:

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

Isso corresponderá a -! "# $% & '() * +,. / :; <=> ? @ [\] ^ _` {|} ~ Que unicode considera Pontuação e Símbolos.

ou:

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

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

perlpor padrão, use o código do idioma POSIX. Se você não usar perl, tudo deve ser definido LC_ALL=POSIX, porque localidades diferentes podem ter caracteres de pontuação diferentes, como SAA Cpossui ¢.

cuonglm
fonte