Parece que awk
seria a melhor opção para suas necessidades, pois esses problemas não existem devido ao fato de poder usar campos e registros:
x=$(awk '/some-pattern/ { sub(/\r$/, "") ; printf("%s", $NF) ; exit }' some-file)
A substituição evita seu problema com finais de linha CRLF.
sub(/\r$/, "")
remove o CR final, se existir. Como awk
trata \n
como o separador de registro (linha), não é necessário separá-lo, pois ele não está nos dados que estão sendo observados.
printf("%s", $NF)
imprime o campo final ( $NF
) sem nova linha à direita ( print
e algumas outras funções awk
acrescentam uma nova linha por padrão).
exit
acontece após as duas primeiras ações - isso equivale a m1
na linha de comando grep
. Isso garante que awk
saia após a execução dos dois comandos anteriores - e como esses comandos são emitidos em uma correspondência, e awk avalia os dados de uma maneira FIFO, isso somente imprimirá a primeira correspondência.