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

У меня есть файл с именем 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"

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

благодаря

2 Solutions collect form web for “Некоторые символы исчезают после обработки текстового файла”

Мне было рекомендовано попробовать 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') .

  • Сценарий оболочки, написанный в другой оболочке, чем моя текущая оболочка
  • Как получить дополнительную информацию о происхождении кода выхода?
  • Запуск приложения X из сценария оболочки через системный таймер
  • Как войти в удаленную учетную запись пользователя с помощью пароля и выполнить набор команд?
  • Использование df и попытка awk определенного столбца
  • Для цикла для переименования файлов с подсказкой для каждого имени файла
  • Очистить содержимое файла
  • Как использовать регулярное выражение в sed?
  • Как удалить столбец или несколько столбцов из файла с помощью команды оболочки?
  • Как запустить скрипт как ограниченный пользователь?
  • Как разобрать XML в CSV с помощью сценария оболочки?
  • Linux и Unix - лучшая ОС в мире.