Я обнаружил, что многие из моих файлов имеют окончания строк DOS. В VI они выглядят так: "^ М". Я не хочу изменять файлы, которые не имеют этих окончаний строк DOS. Как это сделать, используя bash script? Спасибо!
Е.В.
Я обнаружил, что многие из моих файлов имеют окончания строк DOS. В VI они выглядят так: "^ М". Я не хочу изменять файлы, которые не имеют этих окончаний строк DOS. Как это сделать, используя bash script? Спасибо!
Е.В.
grep -URl ^M . | xargs fromdos
grep получает список всех файлов в текущем каталоге с окончанием строки DOS.
-U
позволяет grep рассматривать концы строк, а не удалять их по умолчанию
-R
делает рекурсивным
-l
позволяет отображать только имена файлов, а не соответствующие строки
тогда вы передаете этот список в команду преобразователя (которая находится fromdos
на ubuntu, dos2unix
, откуда я пришел).
ПРИМЕЧАНИЕ: на самом деле не набирают ^M
. вместо этого вам нужно нажать <Ctrl-V>
, затем <Ctrl-M>
, чтобы вставить символ ^M
и заставить grep понять, для чего вы собираетесь. или вы можете ввести $'\r'
вместо ^M
(но я думаю, что это может работать только для bash...).
На ubuntu вы используете утилиту fromdos
fromdos test.txt
В приведенном выше примере можно взять файл MS-DOS или Microsoft Windows или другой файл с разными разделителями строк и форматировать файл с новыми разделителями строк для чтения в Linux и Unix.
Один из способов: GNU coreutils
:
< file.txt tr -d '\r'
Есть много вариантов... вы можете попробовать любой из них. http://www.theunixschool.com/2011/03/different-ways-to-delete-m-character-in.html
вы можете использовать команду:
dos2ux file.in>file.out or:
в perl:
perl -pi -e 's/\r//g' your_file
альтернативно вы можете:
:%s/[ctrl-V][CTRL-M]//g
Обратите внимание, что если вы конвертируете многобайтные файлы, вам необходимо проявлять особую осторожность и, вероятно, следует использовать правильные значения 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.
Модификация ответа на выигрыш, если вам нужно отфильтровать по завершению файла
grep -URl ^M . | grep .php | xargs dos2unix
Я использовал dos2unix вместо fromdos, но эффект должен быть тем же.