O comando tr não tem efeito quando usado em $() e salvo em uma variável

O comando tr não tem efeito quando usado em $() e salvo em uma variável

Se eu executar na CLI:

curl time.com | sed -n 's/.*href="\([^"]*\).*/\1/p' | tr " " "\n"

então, como esperado, recebo uma lista de links higienizados da página para STDOUT, cada um em uma nova linha.

No entanto, quando eu salvo isso em uma variável e tento echoisso de um script.sh:

PAGE_LINKS=$(curl time.com | sed -n 's/.*href="\([^"]*\).*/\1/p' | tr " " "\n")
echo $PAGE_LINKS

Eu recebo todos os links em uma linha, separados por espaço. Então, como se isso trfosse ignorado.

Eu tentei várias coisas, incluindo algo como

HREFS=$(tr " " "\n" < "{PAGE_LINKS}")
echo $HREFS

Mas então recebo file too longum erro. Alguma sugestão?

Responder1

De acordo com a bashpágina de manual da $(command)construção:

Bash executa a expansão executando o comando e substituindo a substituição do comando pela saída padrão do comando, com todas as novas linhas finais excluídas. As novas linhas incorporadas não são excluídas, mas podem ser removidas durante a divisão de palavras.

Portanto tr, não é o problema, mas bashexclui as novas linhas, se elas estiverem no final, e remove quaisquer outras novas linhas durante a divisão do Word. Este é o comportamento documentado.

Acredito que você queira esse comportamento na maioria dos lugares. Se você tiver um arquivo com uma lista de nomes de arquivos, então:

for FILENAME in $(cat somefile)
do
     ...
done

Itera sobre a lista de nomes de arquivos. Você não gostaria que as novas linhas somefileatrapalhassem sua lista de palavras para usar como nomes de arquivos e talvez até atrapalhassem seu loop de tarefas concluídas.

Responder2

O problema não é tr, o problema reside em como você está gerando a expansão da variável:

echo $PAGE_LINKS

Cite a expansão variável:

echo "$PAGE_LINKS"

caso contrário, a expansão passará pela divisão de palavras de acordo com o valor de IFS(espaço, tabulação, nova linha por padrão) e expansão do nome do caminho ( *, ?, []).

No seu caso, a divisão do Word está acontecendo, e cada elemento separado por nova linha está sendo considerado individualmente e, finalmente, mostrado como entidades separadas por espaço. O uso de aspas evitará a divisão de palavras (e a expansão do nome do caminho), portanto, toda a expansão será considerada uma única entidade.

informação relacionada