trコマンドは$()で使用され、変数に保存されても効果はありません。

trコマンドは$()で使用され、変数に保存されても効果はありません。

CLIで実行している場合:

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

次に、期待どおりにページからのリンクのリストを新しいSTDOUT行に1つずつインポートします。

ただし、変数に保存して次のようechoに動作しようとすると、次のようになりますscript.sh

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

すべてのリンクをスペースで区切って1行に配置しました。無視されるのと同じですtr

私は次のようなものを含むいくつかのアプローチを試しました。

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

ところでfile too longエラーが発生しました。どんな提案がありますか?

答え1

設定bashのマニュアルページによると$(command)

Bash はコマンドを実行し、コマンド置換をコマンドの標準出力に置き換え、末尾の改行を削除して拡張を実行します。埋め込まれた改行文字は削除されませんが、単語の分離中に削除される可能性があります。

したがって、tr問題ではありませんが、bash単語の分離中に末尾の改行を削除し、他の改行を削除することです。これは文書化された動作です。

私はほとんどの場所でこの動作をしたいと確信しています。ファイル名のリストを含むファイルがある場合:

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

ファイル名のリストを繰り返します。somefileファイル名として使用される単語のリストや、for-do-doneループを複雑にする改行文字は必要ありません。

答え2

問題はそれではなく、tr変数拡張を出力する方法が問題です。

echo $PAGE_LINKS

参照変数の拡張:

echo "$PAGE_LINKS"

IFS*それ以外の場合(デフォルトはスペース、タブ、改行)、およびパス名拡張(、、、)の値に基づいて拡張が?実行されます[]

あなたの場合、単語の分離が発生し、改行で区切られた各要素を個別に取得し、最終的にスペースで区切られたエンティティとして表示されます。引用符を使用すると、単語の分割(およびパス名の拡張)が防止されるため、拡張全体が単一のエンティティとして扱われます。

関連情報