Скрипт Unix добавляет ^ M в конце каждой строки

У меня есть сценарий оболочки Unix, который делает следующее:

  1. создает резервную копию файла
  2. добавляет текст в файл

Теперь в # 2, если я вставлю текст, ^ M будет добавлен во все строки файла.

Например:

echo " a" >> /cust/vivek.txt
echo " b" >> /cust/vivek.txt

vi vivek.txt
abc^M
bcd^M
a^M
b^M

Есть ли способ избежать этого?

Ответ 1

Я не уверен, как echo может dos2unix символы ^M но вы можете удалить их, запустив dos2unix в вашем файле, например:

dos2unix /cust/vivek.txt

Ответ 2

^M - возврат каретки и обычно наблюдается при копировании файлов из Windows. Использование:

od -xc filename

который должен дать список низкого уровня того, как выглядит ваш файл. Если файл не поступает из Windows, то другой возможностью является то, что настройки вашего терминала не переводятся правильно. Проверьте правильность переменной среды TERM.

Если файл появился из Windows, используйте dos2unix или dos2unix sed 's/\r//' file > file.new

Ответ 3

Я подозреваю, что это может быть артефактом ваших настроек vi, а не конкатенацией.

Что значит

cat -v -e filename

показать? Эта команда выгрузит ваш файл и пометит контрольные символы, чтобы он мог понять, что действительно в вашем файле. См. Также этот вопрос/вопрос для суперпользователя.

Ответ 4

^ M - метасимволы, которые вошли в ваш файл, когда он использовался в окнах.

команда dos2unix может это исправить.

dos2unix <filename>

Ответ 5

Только

sed -e "s/\r//g" file

работал на меня