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.

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

+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:]]/'


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 ¢.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.