Некоторые символы исчезают после обработки текстового файла

У меня есть файл с именем address.txt:

address1@domain.com address2@domain.com address3@domain.com 

Я хотел бы эхо «address1@domain.com.html» использовать для цикла. Вот что я сделал:

 cat addresses.txt | while read address do echo "${address}.html" done 

Вот результат:

 .htmlss1@domain.com .htmlss2@domain.com .htmlss3@domain.com 

Тот же результат, если я добавлю пробел между переменной и ".html"

Что мне не хватает?

благодаря

Мне было рекомендовано попробовать dos2unix addresses.txt , и я могу сказать, что это решило проблему. Большое спасибо !!

Что происходит, так это то, что файл находится в формате Windows, где символы новой строки представлены двухсимвольной комбинацией CR, LF. Вы используете инструменты Unix, которые ожидают, что новые строки будут представлены способом Unix, с только символом LF. Оболочка рассматривает CR (возврат каретки) как обычный символ, поэтому он становится частью значения address переменной. Когда вы распечатываете результат на терминале, терминал интерпретирует символ CR как «вернуться к началу текущей строки», поэтому бит .html который появляется после того, как CR перезаписывает начало строки.

Вы можете преобразовать файл, чтобы использовать новые строки Unix .

Если вы хотите, чтобы ваш код был надежным для ввода файлов с кодировкой Windows newline, вы можете сказать оболочке рассматривать 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 

В ksh93, bash и zsh вы можете использовать $'\r' вместо $(printf '\r') .