
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 - sed
pelo menos a declaração - mas se você quiser saber o que está acontecendo no sed
espaço padrão de você deve l
dar uma olhada:
sed 'l;s|/$||;l'
Eu acho que você poderia fazer tudo sed
assim:
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 /
)