Quiero encontrar una cadena en una línea de texto e imprimir la cadena (entre espacios) y la primera palabra de la frase.
Por ejemplo:
"Esta es una sola línea de texto" "Otra cosa" "Es mejor que lo intentes de nuevo" "Mejor"
La lista de cadenas es:
texto cosa tratar Mejor
Lo que intento es obtener una tabla como esta:
Este texto [tab] Otra cosa [tab] [Tab] intente Mejor
Lo intenté con grep pero no ocurrió nada. ¿Cualquier sugerencia?
command-line
text-processing
regex
Felipe Lira
fuente
fuente
Respuestas:
Versión bash / grep:
Llámalo así:
Salida:
fuente
¡Perl al rescate!
Guardar como
first-plus-word
, correr comoCrea una expresión regular de las palabras de entrada. Cada línea se compara con la expresión regular, y si hay una coincidencia, se imprime la primera palabra, y si es diferente a la palabra, la palabra también se imprime.
fuente
Aquí hay una versión awk:
donde
file2
está la lista de palabras yfile1
contiene las frases.fuente
Aquí está la versión de Python:
Manifestación:
Nota al margen : el script es
python3
compatible, por lo que puede ejecutarlo conpython2
opython3
.fuente
Prueba esto:
Si la pestaña anterior
Better
es un problema, intente esto:Lo anterior se probó en GNU sed (llamado
gsed
en OSX). Para BSD sed, pueden ser necesarios algunos cambios menores.Cómo funciona
s/(([[:alnum:]]+)[[:space:]].*)?(text|thing|try|Better).*/\2\t\3/
Esto busca una palabra,
[[:alnum:]]+
seguida de un espacio,[[:space:]]
seguida de cualquier cosa.*
, seguida de una de sus palabrastext|thing|try|Better
, seguida de cualquier cosa. Si se encuentra eso, se reemplaza con la primera palabra en la línea (si existe), una pestaña y la palabra coincidente.ta; b; :a; s/^\t//; p
Si el comando de sustitución resultó en una sustitución, lo que significa que una de sus palabras se encontró en la línea, entonces el
ta
comando le dice a sed que salte a la etiquetaa
. Si no, entonces ramificamos (b
) a la siguiente línea.:a
define la etiqueta a. Entonces, si se encontró una de sus palabras, nosotros (a) hacemos la sustitucións/^\t//
que elimina una pestaña inicial si hay una, y (b) imprimimos (p
) la línea.fuente
Un enfoque simple bash / sed:
El
while read w; do ...; done < words
iterará sobre cada línea en el archivowords
y lo guardará como$w
. Las-n
marcassed
no imprimen nada por defecto. Elsed
comando a continuación, reemplazará a las comillas dobles seguidos de no está en blanco (\"(\S*)
los paréntesis sirven para "capturar" lo que se corresponde con\S*
la primera palabra, y después nos pueden referirse a ella como\1
), 0 o más caracteres (.*
) y luego el palabra que estamos buscando ($w
) y 0 o más caracteres nuevamente (.*
). Si esto coincide, lo reemplazamos con solo la primera palabra, una pestaña y$w
(\1\t$w
), e imprimimos la línea (eso es lo que hace elp
ins///p
).fuente
Esta es la versión Ruby
El archivo de texto de muestra
hello.txt
contieneEjecutando con
ruby source.rb hello.txt
resultados enfuente