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
file2está la lista de palabras yfile1contiene las frases.fuente
Aquí está la versión de Python:
Manifestación:
Nota al margen : el script es
python3compatible, por lo que puede ejecutarlo conpython2opython3.fuente
Prueba esto:
Si la pestaña anterior
Betteres un problema, intente esto:Lo anterior se probó en GNU sed (llamado
gseden 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//; pSi 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
tacomando le dice a sed que salte a la etiquetaa. Si no, entonces ramificamos (b) a la siguiente línea.:adefine 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 < wordsiterará sobre cada línea en el archivowordsy lo guardará como$w. Las-nmarcassedno imprimen nada por defecto. Elsedcomando 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 elpins///p).fuente
Esta es la versión Ruby
El archivo de texto de muestra
hello.txtcontieneEjecutando con
ruby source.rb hello.txtresultados enfuente