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
*
それ以外の場合(デフォルトはスペース、タブ、改行)、およびパス名拡張(、、、)の値に基づいて拡張が?
実行されます[]
。
あなたの場合、単語の分離が発生し、改行で区切られた各要素を個別に取得し、最終的にスペースで区切られたエンティティとして表示されます。引用符を使用すると、単語の分割(およびパス名の拡張)が防止されるため、拡張全体が単一のエンティティとして扱われます。