final de línea en linux y mac

final de línea en linux y mac

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, sedal menos la declaración, pero si quieres saber qué está sucediendo en sedel espacio de patrones, deberías lecharle un vistazo:

sed 'l;s|/$||;l'

Creo que podrías hacer todo sedcomo:

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 /)

información relacionada