Considere este fragmento:
X=$(grep -m1 'some-pattern' some-file | sed -n 's/.* //p')
Quiero poner la última palabra en una variable si alguna condición de patrón coincide con líneas en un archivo de texto arbitrario
Mi problema es que la variable X
tiene CR o LF o CRLF al final, dependiendo del archivo de origen, del que quiero deshacerme, ya que interfiere con la operación posterior que pretendo hacer.
Incluso probé algo como:
X=$(grep -m1 'some-pattern' some-file | sed -n 's/.* \([A-Za-z]\+\)/\1/p')
por lo tanto, se espera que la sed
salida esté limitada [A-Za-z]+
pero aún existen estos molestos bytes dentro de la variable X.
¿Cómo puedo deshacerme de él, sin utilizar demasiada código como ver lo que son bytes al final con xxd
entonces cut
y similares complicaciones?
X
CR
, pero habrá unLF
. Me costó mucho entender lo que quieres de la pregunta, espero que mi edición haga lo que quieras.grep/sed
soluciónawk
(lo cual no entiendo), y si no, lo usaré. GraciasEl
``
o$()
eliminará la nueva línea del final, pero para hacer esto programáticamente, usetr
.Esto eliminará el retorno de carro y / o la nueva línea de la cadena.
Lo que podría ser el problema es cómo se genera el resultado. Por ejemplo, por defecto,
echo
agrega una nueva línea. Es posible que desee utilizarecho -n
oprintf
.fuente
-m1
se asegurará de que sólo hay una salida de línea, que con toda probabilidad, tendría el retorno de carro al final.tr
... interesante, funciona tanto en archivos LF como CRLF. Pensaría\010\013
por alguna razón, y también\f\r
funciona correctamente. Sobre el resultado: en realidad no pongo la salida en variable sino como variable encerrada$()
en un patrón para lagrep
coincidencia -some pipe | grep -o " $(...) "
. Gracias por los comentariosPrefiero asi
fuente
Esto funciona para mi:
fuente
¿Por qué no simplemente dejar
sed
hacer la[\r\f]
limpieza?Su segundo enfoque carece de una expresión regular final para coger el CR de salida,
\r
.fuente
La versión normal de grep (incluido grep -P) siempre genera un avance de línea con su coincidencia, por lo que si solo tiene un resultado (o solo desea que se elimine el avance de línea agregado final), es suficiente simplemente eliminar el carácter final de la salida, que puede hacer canalizándola
head -c-1
.fuente