
Estoy analizando un archivo de texto buscando una ruta que esté escrita después de una línea que comience con "salida". La línea es algo así como
output xyz/mypath/
y quiero extraerxyz/mypath
sinel corte final.
En mi Mac OS X (BSD) y Linux obtengo comportamientos diferentes cuando obtengo la ruta con esto
basepath=cat $basefile | grep -e ^output\ | cut -d" " -f2 | rev | sed 's@/$@@' | rev
La parte complicada parece ser
sed 's@/$@@
que en Mac funciona, mientras que en Linux no. Viceversa si lo hago
sed 's@/@@
Funciona en Linux, no en Mac (BSD).
El truco parece estar relacionado con el char $ de final de línea que se administra de manera diferente (tal vez en el nivel de cat. ¿Alguna sugerencia para solucionar esto de manera que tanto la consola Mac como la Linux hagan el trabajo?
Respuesta1
No tengo fácil acceso a una máquina OSX, pero de todos modos su enfoque es innecesariamente complejo. En su lugar, simplemente haga algo como esto (dependiendo de su entrada real):
basepath=$(grep ^output "$basefile" | awk '{print $NF}' | sed 's/[/]$//'
o
basepath=$(awk '/^output/{print $2}' "$basefile" | sed 's/[/]$//')
o incluso
basepath=$(grep -oP '^output\s+\K.+(?=/)' "$basefile")
o
basepath=$(perl -lne 'print $1 if /^output\s+(.+)\//' "$basefile";
Respuesta2
Por lo que yo sé, eso debería funcionar tal como está en Linux, sed
al menos la declaración, pero si quieres saber qué está sucediendo en sed
el espacio de patrones, deberías l
echarle un vistazo:
sed 'l;s|/$||;l'
Creo que podrías hacer todo sed
como:
basepath=$(sed '/^output /!d;s|||;s|/$||' <"$basefile")
Respuesta3
Yo sugeriría
sed -n '/^output / {s///; s,\(.*\)/,\1,p}'
que debería funcionar en GNU y OSX sed.
La expresión regular vacía s///
reutiliza la expresión regular anterior ( /^output /
)