Какой лучший способ конвертировать CRLF в перевод строки в файлах в Linux?
Я видел команды sed , но есть ли что-нибудь попроще?
Какой лучший способ конвертировать CRLF в перевод строки в файлах в Linux?
Я видел команды sed , но есть ли что-нибудь попроще?
Ответы:
Используйте эту команду:
fromdos yourtextfile
Наоборот:
todos yourtextfile
Эти команды находятся в пакете tofrodos (в большинстве последних дистрибутивов), который также предоставляет две оболочки - unix2dos и dos2unix, которые имитируют старые инструменты unix с тем же именем.
find . -name '*.txt' -print0 | xargs -null fromdos
Использование dos2unix
.
dos2unix - Конвертер форматов текстовых файлов DOS / MAC в UNIX
dos2unix [options] [-c convmode] [-o file ...] [-n infile outfile ...] Options: [-hkqV] [--help] [--keepdate] [--quiet] [--version]
Я предпочитаю Perl :
perl -lne 's/\r//g; print' winfile.txt > unixfile.txt
Но это хорошо подходит для моих целей, и мне очень легко запомнить. Не во всех системах есть команда dos2unix, но большинство, над которыми я работаю, имеют интерпретатор perl.
Другой - перекодирование , мощная замена для dos2unix и iconv; он доступен в пакете «recode» в репозиториях Debian:
recode ibmpc..lat1 winfile.txt # dos2unix
recode lat1..ibmpc unixfile.txt # unix2dos
Для фанатов awk :
awk '{ sub("\r$", ""); print }' winfile.txt > unixfile.txt
... и sed :
sed 's/\r$//' winfile.txt > unixfile.txt
И теперь, только чуть-чуть менее запутанно, чем удаление CR вручную в шестнадцатеричном редакторе, прямо от одного из наших друзей stackoverflow.com , который можно использовать с интерпретатором beef (находится в вашем дружественном соседнем репозитории Debian),
dos2unix в Brainfuck !
,[[->+>+<<]>>>,[<-------------[+++++++++++++.>>>]<[>>----------[>+++++++++++++.-------------]<++++++++++>]<<<<[-]>>>[-<<<+>>>]]<[-]<[-]<]++++++++++.
Большое спасибо JK за потраченный час его жизни, чтобы написать это!
Я делаю это на Bash :
cat cr_stuffed.file | tr -d \r > no_more_crs.file
Я думаю, что вы также можете использовать tr
(хотя у меня нет забавных файлов формата, чтобы попробовать):
tr -d '\r' < file1 > file2
Я нашел очень простой способ ... Открыть файл с помощью nano: ## nano file.txt
нажмите Ctrl + O для сохранения, но перед нажатием Enter нажмите: Alt + D для переключения между окончаниями строк DOS и Unix / Linux или: Alt + M для переключения между окончаниями Mac и Unix / Linux, затем нажмите Enter для сохранения и Ctrl + X, чтобы выйти.
Alt+d
. Иногда alt перехватывается терминальной программой, поэтому вы можете использовать esc+d
вместо этого.
Если вам нужен метод с графическим интерфейсом, попробуйте текстовый редактор Kate (другие продвинутые текстовые редакторы тоже могут с этим справиться). Откройте диалог поиска / замены ( Ctrl+ R) и замените \r\n
на \n
. (Примечание: вам нужно выбрать «Регулярное выражение» из выпадающего списка и отменить выбор «Только выбор» из опций.)
EDIT: Или, если вы просто хотите конвертировать в формат Unix, то используйте опцию меню Tools
> End of Line
> Unix
.
\r\n
в \n
то с помощью поиска / замены проще , чем припоминания , которая использует ОС , какая линия заканчивающегося. ;)
Вставьте это в скрипт Python dos2unix.py .
#!/usr/bin/env python
"""\
convert dos linefeeds (crlf) to unix (lf)
usage: dos2unix.py <input> <output>
"""
import sys
if len(sys.argv[1:]) != 2:
sys.exit(__doc__)
content = ''
outsize = 0
with open(sys.argv[1], 'rb') as infile:
content = infile.read()
with open(sys.argv[2], 'wb') as output:
for line in content.splitlines():
outsize += len(line) + 1
output.write(line + '\n')
print("Done. Saved %s bytes." % (len(content)-outsize))
Должен работать на любой платформе с установленным Python. Всеобщее достояние.
CR LF
с LF
использованием AWK :
awk -v RS='\r?\n' 1
command | awk -v RS='\r?\n' 1
awk -v RS='\r?\n' 1 filename
Пример использования:
echo -e 'foo\nbar\r\nbaz' | awk -v RS='\r?\n' 1 | hexdump -C
Объяснение:
-v RS='\r?\n'
устанавливает переменную RS ( input r ecord s eparator) в \r?\n
значение, означающее, что input читается строка за строкой, разделенная LF ( \n
), которой может ( ?
) предшествовать CR ( \r
).
1
скрипт, исполняемый awk Сценарий состоит из condition { action }
. В этом случае 1
это условие, которое оценивается как истинное. Действие опущено, поэтому выполняется действие по умолчанию, что означает печать текущей строки (которая также может быть записана как {print $0}
или просто {print}
).
LF
в CR LF
: Вы можете установить переменную ORS
( о utput г ecord s eparator) , чтобы изменить концы линии выхода. Пример:
echo -e 'foo\nbar\r\nbaz' | awk -v RS='\r?\n' -v ORS='\r\n' 1 | hexdump -C
Я использовал этот скрипт для файлов, необходимых для экстренной передачи файлов из системы Windows в систему Unix.
find . -type f | xargs file | grep CRLF | cut -d: -f1 | xargs dos2unix
find . -type f
Находит все файлы, рекурсивно в каталоге, из которого вы запускаете команду
xargs file
Передайте его в файловую программу, чтобы получить анализ файла.
grep CRLF
Мы хотим только вывод файла, который показывает CRLF.
cut -d: -f1
Получите выход до цвета. откажитесь от всего остального. У нас должно быть только имя файла
xargs dos2unix