fim de linha no linux e mac

fim de linha no linux e mac

Estou analisando um arquivo de texto procurando um caminho que esteja escrito após uma linha que começa com "saída". A linha é algo como

output xyz/mypath/

e eu quero extrairxyz/mypath sema barra final.

No meu Mac OS X (BSD) e Linux, obtenho comportamentos diferentes quando obtenho o caminho com este basepath=cat $basefile | grep -e ^output\ | cut -d" " -f2 | rev | sed 's@/$@@' | rev

A parte complicada parece ser

sed 's@/$@@

que funciona no Mac, mas não no Linux. Vice-versa se eu fizer

sed 's@/@@ funciona no Linux e não no Mac (BSD).

O truque parece estar relacionado ao char $ de fim de linha que é gerenciado de forma diferente (talvez no nível de cat. Alguma sugestão para contornar isso de forma que tanto o console Mac quanto o Linux façam o trabalho?

Responder1

Não tenho acesso fácil a uma máquina OSX, mas sua abordagem é desnecessariamente complexa. Basta fazer algo assim (dependendo da sua entrada real):

basepath=$(grep ^output "$basefile" | awk '{print $NF}' | sed 's/[/]$//'

ou

basepath=$(awk '/^output/{print $2}' "$basefile" | sed 's/[/]$//')

ou mesmo

basepath=$(grep -oP '^output\s+\K.+(?=/)' "$basefile")

ou

basepath=$(perl -lne 'print $1 if /^output\s+(.+)\//' "$basefile";

Responder2

Até onde eu sei, isso deve funcionar como está no Linux - sedpelo menos a declaração - mas se você quiser saber o que está acontecendo no sedespaço padrão de você deve ldar uma olhada:

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

Eu acho que você poderia fazer tudo sedassim:

basepath=$(sed '/^output /!d;s|||;s|/$||' <"$basefile")

Responder3

eu sugeriria

sed -n '/^output / {s///; s,\(.*\)/,\1,p}'

que deve funcionar no sed GNU e OSX.

A regex vazia s///reutiliza a regex anterior ( /^output /)

informação relacionada