Imprime todas las líneas que no contienen puntuación

8

Quiero un patrón regex que pueda imprimir todas las líneas que no contengan puntuación:

Entrada:

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

Salida: (debería ser)

This is line 4

Lo que he probado hasta ahora:

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

Pero muestra todos los caracteres que no son signos de puntuación.

Hamed Kamrava
fuente

Respuestas:

11

Sus grepimpresiones de todas las líneas que contienen caracteres que no sean de puntuación. Eso no es lo mismo que imprimir todas las líneas que no contienen caracteres de puntuación.

Para este último, desea el -vinterruptor (líneas de impresión que no coinciden con el patrón):

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

Si, por alguna razón, no desea utilizar el -vinterruptor, debe asegurarse de que toda la línea consta de caracteres que no sean de puntuación:

grep '^[^[:punct:]]\+$' file.txt
Joseph R.
fuente
+1 gracias. ¿Hay alguna manera sin usar el -vinterruptor?
Hamed Kamrava
@HamedKamrava Sí. Por favor vea mi edición.
Joseph R.
@HamedKamrava Por curiosidad: ¿por qué querrías evitarlo -v?
Bernhard
No evito -vsolo quiero saber más :)
Hamed Kamrava
@HamedKamrava Por favor, no olvide marcar esta respuesta como 'Aceptada' si resuelve su problema.
Joseph R.
1

En sed puedes hacer algo como:

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

En awk puedes hacer:

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

ryekayo
fuente
1

A Perlunos:

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

Esto coincidirá con -! "# $% & '() * +,. / :; <=> ? @ [\] ^ _` {|} ~ Que Unicode considera signos de puntuación y símbolos.

o:

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

\p{Punct}solo coincide con -! "#% & '() *,. /:;? @ [\] _ {} , falta $ + <=> ^` | ~ que Unicode considera Símbolos.

perlde forma predeterminada, use el entorno local POSIX. Si no lo usa perl, debería configurarlo todo LC_ALL=POSIX, ya que una configuración regional diferente puede tener caracteres de puntuación diferentes como SAA Ctiene ¢.

Cuonglm
fuente