Найдите и удалите окончание строк DOS на Ubuntu

Я обнаружил, что многие из моих файлов имеют окончания строк DOS. В VI они выглядят так: "^ М". Я не хочу изменять файлы, которые не имеют этих окончаний строк DOS. Как это сделать, используя bash script? Спасибо!

Е.В.

Ответ 1

grep -URl ^M . | xargs fromdos

grep получает список всех файлов в текущем каталоге с окончанием строки DOS.

-U позволяет grep рассматривать концы строк, а не удалять их по умолчанию

-R делает рекурсивным

-l позволяет отображать только имена файлов, а не соответствующие строки

тогда вы передаете этот список в команду преобразователя (которая находится fromdos на ubuntu, dos2unix, откуда я пришел).

ПРИМЕЧАНИЕ: на самом деле не набирают ^M. вместо этого вам нужно нажать <Ctrl-V>, затем <Ctrl-M>, чтобы вставить символ ^M и заставить grep понять, для чего вы собираетесь. или вы можете ввести $'\r' вместо ^M (но я думаю, что это может работать только для bash...).

Ответ 2

На ubuntu вы используете утилиту fromdos

fromdos test.txt

В приведенном выше примере можно взять файл MS-DOS или Microsoft Windows или другой файл с разными разделителями строк и форматировать файл с новыми разделителями строк для чтения в Linux и Unix.

Ответ 3

Один из способов: GNU coreutils:

< file.txt tr -d '\r'

Ответ 5

вы можете использовать команду:

   dos2ux file.in>file.out or:

в perl:

perl -pi -e 's/\r//g' your_file

альтернативно вы можете:

  • открыть в vi
  • перейти в командный режим
  • type :%s/[ctrl-V][CTRL-M]//g

Ответ 6

Обратите внимание, что если вы конвертируете многобайтные файлы, вам необходимо проявлять особую осторожность и, вероятно, следует использовать правильные значения iconv или перекодировать из-кодирования.

Если это простой ASCII файл, оба этих метода будут работать.

Программа flip, в Debian пакет также называется flip, может обрабатывать строки. Из руководства:

When asked to convert a file to the same format that  it already 
has, flip  causes  no change to the file. Thus to convert all
files to **IX format you can type

flip -u *

and all files will end up right, regardless of whether they were 
in MS-DOS or in **IX format to begin with. This also works in the
opposite direction.

Или вы можете использовать GNU recode:

< /etc/passwd recode ..pc | tee a b > /dev/null
file a b

Вывод:

a: ASCII text, with CRLF line terminators
b: ASCII text, with CRLF line terminators

Преобразование в конец строки unix:

recode pc.. a b
file a b

Вывод:

a: ASCII text
b: ASCII text

recode abbreviates dos line-endings как pc, поэтому логика с pc..: преобразование из формата pc в значение по умолчанию, которое является latin1 с окончанием строки unix.

Ответ 7

Модификация ответа на выигрыш, если вам нужно отфильтровать по завершению файла

grep -URl ^M . | grep .php | xargs dos2unix

Я использовал dos2unix вместо fromdos, но эффект должен быть тем же.