удалить терминаторы линии CR

Во-первых, я бы сказал, что прочитал this post, однако у меня все еще есть проблемы с CR line terminators.

Есть файл с именем build_test.sh, который я редактировал в leafpad, и он может отображаться прямо в Vim:

cp ~/moonbox/llvm-2.9/lib/Transforms/MY_TOOL/$1 test.cpp 
cd ~/moonbox/llvm-obj/tools/TEST_TOOL/
make
make install
cd -

Тем не мение:

  1. Используя cat build_test.sh, он не выводит ничего.
  2. Используя more build_test.sh, он выводит: cd - install/llvm-obj/tools/TEST_TOOL/Y_TOOL/$1 test.cpp
  3. Используя less build_test.sh, он выводит: cp ~/moonbox/llvm-2.9/lib/Transforms/MY_TOOL/$1 test.cpp^Mcd ~/moonbox/llvm-obj/tools/TEST_TOOL/^Mmake^Mmake install^Mcd -

Результат file build_test.sh:

build_test.sh: ASCII text, with CR line terminators

После этот пост, ^M больше не существует, однако разрыва строки больше нет :-(
Результат file build_test_no_cr.sh теперь:

build_test_nocr.sh: ASCII text, with no line terminators

Решение можно увидеть здесь.

Однако мне все еще хотелось бы, почему cat ничего не отображает, а more показывает такой странный результат. Кроме того, почему dos2unix и set fileformat=unix в Vim не работают в этом случае.

ps: я предполагаю, что, возможно, мой редактор (Vim или leafpad?) генерирует только \r, а не \n для новой строки. Как же так?


person Hongxu Chen    schedule 29.12.2012    source источник


Ответы (3)


Простые \r терминаторы для новых строк - это терминаторы строк "старого Mac", странно, что редактор 2012+ даже генерирует файлы с такими символами конца строки ... В любом случае, вы можете использовать команду mac2unix, которая является частью дистрибутива dos2unix:

# Edits thefile inline
mac2unix thefile
# Takes origfile as an input, outputs to dstfile
mac2unix -n origfile dstfile

Эта команда не изменяет файлы, в которых уже есть символы конца строки, что является бонусом. И обратное (unix2mac) тоже существует.

Обратите внимание, что mac2unix совпадает с dos2unix -c mac.

person fge    schedule 29.12.2012
comment
Что самое странное, эта команда всегда работала у меня. Не хотите сказать, как вы пытаетесь его использовать? - person fge; 29.12.2012
comment
build_test.sh редактируется сначала с помощью leafpad (не из Windows или OS OS). Я просто использую dos2unix build_test.sh build_test_nocr.sh, а file build_test_nocr.sh говорит мне, что build_test_nocr.sh: ASCII text, with CR line terminators - person Hongxu Chen; 29.12.2012
comment
Вы сказали, что это не из Windows или ОС DOS - тогда что это за ОС? - person fge; 29.12.2012
comment
Хорошо, я сделал очень грубую ошибку в синтаксисе, на самом деле dos2unix изменяет файл на месте ... Попробуйте посмотреть отредактированный пост - person fge; 29.12.2012
comment
Вы имеете в виду dos2unix build_test.sh? Нет эффекта. Я обновил вопрос и надеюсь, что вы сможете объяснить: - › - person Hongxu Chen; 29.12.2012
comment
Хм, похоже, что терминаторы линии только для \r - старые терминаторы в стиле Mac. Вы можете попробовать mac2unix вместо этого? - person fge; 29.12.2012
comment
Да, работает, спасибо! Кстати, не могли бы вы рассказать мне о нечетном результате _1 _, _ 2_ или еще немного подробностей? - person Hongxu Chen; 29.12.2012
comment
Я не знаю точно, но я думаю, что это связано с тем, как терминал обрабатывает символы новой строки. На мой взгляд, терминалы распознают символ \n как новую строку и выполнят соответствующее действие на дисплее, тогда как они будут отображать \r как ^M. Терминалы (ну ттыс) дело сложное ... - person fge; 29.12.2012

Кроме того, если вы работаете с vim, вы можете принудительно использовать окончания строк UNIX, выполнив

:set fileformat=unix
:w

или просто добавь

set fileformat=unix

в ваш .vimrc файл

person jpmuc    schedule 29.12.2012

Я наконец понял, что могу использовать эту команду:

tr '^M' '\n' <build_test.sh >build_test_nocr.sh

где ^M добавляется нажатием клавиш Ctrl+v и Enter. Альтернативно, это имеет тот же эффект:

tr '\r' '\n' <build_test.sh >build_test_nocr.sh
person Hongxu Chen    schedule 29.12.2012
comment
Из любопытства, что CTRL-V делает с терминалом? - person ddrjm; 28.08.2020
comment
@ddrjm обычно означает дословную вставку, см. superuser.com/a/421468/88312 - person Hongxu Chen; 30.08.2020