
Address.txtというファイルがあります。
[email protected]
[email protected]
[email protected]
私はそれを反響したい」[Eメール保護]「forループを使用してください。私がしたことは次のとおりです。
cat addresses.txt | while read address
do
echo "${address}.html"
done
結果は次のとおりです。
[email protected]
[email protected]
[email protected]
変数と「.html」の間にスペースを追加すると、同じ結果が表示されます。
私は何を見逃していますか?
ありがとう
答え1
何が起こるかは、ファイルがWindows形式であるということです。改行文字CRとLFという2つの文字の組み合わせで表されます。使用しているUnixツールは、改行文字がLF文字のみを使用してUnix形式で表現されることを期待しています。シェルはキャリッジリターン(CR)をプレーン文字として扱うため、変数valueの一部になりますaddress
。端末から結果を印刷すると、端末はCR文字を「現在行の先頭に戻る」と解釈します。これは.html
CRの後のビットが行の先頭を上書きする理由です。
あなたはできますUnix改行文字を使用するようにファイルを変換する。
コードがWindowsの改行文字でエンコードされた入力ファイルに対して強力になるようにするには、CRを次に追加します。IFS
変える。
while IFS="$IFS$(printf '\r')" read address; do
echo "${address}.html"
done <addresses.txt
別の回避策は、値の終わり(存在する場合)からCR文字を削除することです。パラメータ拡張文字列操作の構成。ファイルに実際にバックスラッシュ - CR - 新しい行が含まれている場合は、行連続のバックスラッシュ - 新しい行が機能しないため、混乱を避けるためにオフにする必要があります。
CR=$(printf '\r')
while read -r address; do
address=${address%$CR}
echo "${address}.html"
done <addresses.txt
$'\r'
ksh93では、bashとzshを代わりに使用できます$(printf '\r')
。
答え2
誰かが私に試してみることを提案し、dos2unix addresses.txt
これが問題を解決したと言うことができます。ありがとうございます! !