テキストファイルを処理すると、一部の文字が消えます。

テキストファイルを処理すると、一部の文字が消えます。

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文字を「現在行の先頭に戻る」と解釈します。これは.htmlCRの後のビットが行の先頭を上書きする理由です。

あなたはできます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')

おすすめ記事