fim de linha no linux e mac

1

Estou analisando um arquivo de texto procurando por um caminho que está escrito depois de uma linha que começa com "saída". A linha é algo como

output xyz/mypath/

e eu quero extrair xyz/mypath sem a barra final.

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

A parte complicada parece ser

sed 's@/$@@

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

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

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

    
por Rho Phi 11.06.2014 / 12:21

3 respostas

1

Eu 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 até mesmo

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

ou

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

Isso deve funcionar como está no Linux, até onde eu sei - a declaração sed , pelo menos - mas se você quiser saber o que está acontecendo no espaço padrão sed , você deve l ook:

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

Eu acho que você poderia fazer a coisa toda em sed como:

basepath=$(sed '/^output /!d;s|||;s|/$||' <"$basefile")
    
por 11.06.2014 / 12:33
0

Eu sugeriria

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

que deve funcionar no GNU e OSX sed.

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

    
por 11.06.2014 / 22:39

Tags