Какой самый простой способ удалить все возвраты каретки \r
из файла в Unix?
Какой самый простой способ удалить все возвраты каретки \r
из файла в Unix?
Ответы:
Я буду считать , что вы имеете в виду возврат каретки ( CR, "\r"
, 0x0d
) в концах строк , а не просто слепо в файле (вы можете иметь их в середине строки для всех я знаю). Используя этот тестовый файл только CRв конце первой строки:
$ cat infile
hello
goodbye
$ cat infile | od -c
0000000 h e l l o \r \n g o o d b y e \n
0000017
dos2unix
это путь, если он установлен в вашей системе:
$ cat infile | dos2unix -U | od -c
0000000 h e l l o \n g o o d b y e \n
0000016
Если по какой-то причине вам dos2unix
это не доступно, то sed
сделаем это:
$ cat infile | sed 's/\r$//' | od -c
0000000 h e l l o \n g o o d b y e \n
0000016
Если по какой-то причине вам sed
это недоступно, то ed
сделаем это сложным образом:
$ echo ',s/\r\n/\n/
> w !cat
> Q' | ed infile 2>/dev/null | od -c
0000000 h e l l o \n g o o d b y e \n
0000016
Если на вашем компьютере не установлено ни одного из этих инструментов, у вас есть большие проблемы, чем при попытке конвертировать файлы :-)
\r
работает только с GNU sed, иначе вы можете сделать это:sed `echo "s/\r//"`
sed
ни в echo
распознавании \r
. В этом случае только printf "\r"
кажется, что работает.
sed "s/$(printf '\r')\$//"
$
следующим образом: sed $'s@\r@@g' |od -c
(но если вы замените ее, \n
вам нужно ее избежать)
tr -d '\r' < infile > outfile
Смотрите tr (1)
tr
команда не поддерживает \r
escape, попробуйте '\015'
или, возможно, литерал '^M'
(во многих оболочках на многих терминалах ctrl-V ctrl-M выдаст буквальный символ ctrl-M).
outfile = infile
?
someProg <in >out && mv out in
.
Самый простой способ для Linux, по моему скромному мнению,
sed -i 's/\r$//g' <filename>
В сильных кавычках вокруг оператора подстановок 's/\r//'
являются существенными . Без них оболочка будет интерпретироваться \r
как escape + r, уменьшать ее до простого r
и удалять все строчные буквы r
. Вот почему ответ, данный Робом в 2009 году , не работает.
А добавление /g
модификатора гарантирует, что \r
будет удалено даже многократное число , а не только первое.
Существует утилита dos2unix, которая существует во многих системах и может быть легко установлена в большинстве систем.
sed -i s/\r// <filename>
или что-то подобное; увидеть man sed
или множество информации, доступной в Интернете, относительно использования sed
.
Следует отметить одно точное значение слова «возврат каретки» в приведенном выше; если вы действительно имеете в виду один управляющий символ «возврат каретки», то приведенная выше схема верна. Если вы имели в виду, в более общем смысле, CRLF (возврат каретки и перевод строки, то есть, как переводы строк реализованы в Windows), то вы, вероятно, хотите заменить \r\n
вместо этого. Голые строки (новая строка) в Linux / Unix есть \n
.
Если вы являетесь пользователем Vi, вы можете открыть файл и удалить возврат каретки с помощью:
:%s/\r//g
или с
:1,$ s/^M//
Обратите внимание, что вы должны набрать ^ M, нажав Ctrl-V, а затем Ctrl-M.
^M
-s вообще. Обойти это - тонна нажатий клавиш, а это не то, для чего создан vim;). Я бы просто пошел sed -i
, а затем `-e 's / \ r $ // g', чтобы ограничить удаление CRs на EOL.
Еще раз решение ... Потому что всегда есть еще один:
perl -i -pe 's/\r//' filename
Это приятно, потому что он работает и работает в каждом варианте Unix / Linux, с которым я работал.
Кто-то еще рекомендует, dos2unix
и я настоятельно рекомендую это также. Я просто предоставляю больше деталей.
Если установлено, перейдите к следующему шагу. Если он еще не установлен, я бы рекомендовал установить его через yum
:
yum install dos2unix
Тогда вы можете использовать его как:
dos2unix fileIWantToRemoveWindowsReturnsFrom.txt
Если вы используете ОС (например, OS X), у которой нет dos2unix
команды, но есть интерпретатор Python (версия 2.5+), эта команда эквивалентна dos2unix
команде:
python -c "import sys; import fileinput; sys.stdout.writelines(line.replace('\r', '\n') for line in fileinput.input(mode='rU'))"
Это обрабатывает как именованные файлы в командной строке, так и каналы и перенаправления, как dos2unix
. Если вы добавите эту строку в файл ~ / .bashrc (или эквивалентный файл профиля для других оболочек):
alias dos2unix="python -c \"import sys; import fileinput; sys.stdout.writelines(line.replace('\r', '\n') for line in fileinput.input(mode='rU'))\""
... при следующем входе в систему (или запуске source ~/.bashrc
в текущем сеансе) вы сможете использовать dos2unix
имя в командной строке так же, как и в других примерах.
Вот вещь,
%0d
символ возврата каретки Сделать его совместимым с Unix. Нам нужно использовать приведенную ниже команду.
dos2unix fileName.extension fileName.extension
Для UNIX ... Я заметил, что dos2unix удалил заголовки Unicode из моего файла UTF-8. В git bash (Windows) следующий скрипт, похоже, работает хорошо. Он использует sed. Обратите внимание, что он удаляет только возврат каретки на концах строк и сохраняет заголовки Unicode.
#!/bin/bash
inOutFile="$1"
backupFile="${inOutFile}~"
mv --verbose "$inOutFile" "$backupFile"
sed -e 's/\015$//g' <"$backupFile" >"$inOutFile"
Если вы работаете в среде X и имеете соответствующий редактор (код Visual Studio), я бы следовал рекомендациям:
Код Visual Studio: как показать окончания строк
Просто перейдите в правый нижний угол экрана, код Visual Studio покажет вам как кодировку файла, так и соглашение об окончании строки, за которым следует файл, простым щелчком мыши вы можете переключить его.
Просто используйте визуальный код в качестве замены для notepad ++ в среде Linux, и все готово.
Notepad++
команду в Edit / EOL Conversion / Unix (LF)
вашей системе Windows перед копированием файла в вашу систему Linux.
\r
в любой системе UNIX®:Большинство существующих решений в этом вопросе специфичны для GNU и не будут работать на OS X или BSD; приведенное ниже решение должно работать на многих других системах UNIX, и в любой оболочке, от tcsh
до sh
, но по- прежнему работать даже на GNU / Linux, тоже.
Протестировано на OS X, OpenBSD и NetBSD в tcsh
и на Debian GNU / Linux в bash
.
sed
:В tcsh
на OS X, следующий sed
фрагмент кода может быть использована вместе с printf
, так как ни , sed
ни echo
ручки \r
особым способом , как ГНУ делает:
sed `printf 's/\r$//g'` input > output
tr
:Другой вариант tr
:
tr -d '\r' < input > output
sed
и tr
:Казалось бы, что tr
сохраняет отсутствие завершающей новой строки из входного файла, тогда как sed
в OS X и NetBSD (но не в OpenBSD или GNU / Linux) вставляет завершающую новую строку в самом конце файла, даже если во входных данных отсутствует какой-либо в конце \r
или \n
в самом конце файла.
Вот несколько примеров тестирования, которые можно использовать, чтобы убедиться, что это работает в вашей системе, используя printf
и hexdump -C
; в качестве альтернативы, od -c
может также использоваться, если ваша система отсутствует hexdump
:
% printf 'a\r\nb\r\nc' | hexdump -C
00000000 61 0d 0a 62 0d 0a 63 |a..b..c|
00000007
% printf 'a\r\nb\r\nc' | ( sed `printf 's/\r$//g'` /dev/stdin > /dev/stdout ) | hexdump -C
00000000 61 0a 62 0a 63 0a |a.b.c.|
00000006
% printf 'a\r\nb\r\nc' | ( tr -d '\r' < /dev/stdin > /dev/stdout ) | hexdump -C
00000000 61 0a 62 0a 63 |a.b.c|
00000005
%
Хотя это старый пост, недавно я столкнулся с той же проблемой. Поскольку у меня были все файлы для переименования внутри / tmp / blah_dir /, так как каждый файл в этом каталоге имел символ «/ r» (в конце файла был символ «?»), Так что делать это способом сценария было только для меня.
Я хотел сохранить окончательный файл с тем же именем (без конечного символа). С sed проблема была в имени выходного файла, которое мне было необходимо, чтобы упомянуть что-то еще (чего я не хотел).
Я пробовал другие варианты, как предложено здесь (не считал dos2unix из-за некоторых ограничений), но не работал.
Наконец, я попытался с "awk", который работал, где я использовал "\ r" в качестве разделителя и взял первую часть :
Хитрость заключается в следующем:
echo ${filename}|awk -F"\r" '{print $1}'
Ниже приведен фрагмент сценария, который я использовал (где у меня все файлы имели «\ r» в качестве завершающего символа в пути / tmp / blah_dir /), чтобы исправить мою проблему:
cd /tmp/blah_dir/
for i in `ls`
do
mv $i $(echo $i | awk -F"\r" '{print $1}')
done
Примечание: этот пример не очень точен, хотя и близок к тому, что я работал (упомяну здесь, чтобы дать лучшее представление о том, что я сделал)
Я сделал этот shell-скрипт для удаления символа \ r. Работает в солярисе и красной шапке:
#!/bin/ksh
LOCALPATH=/Any_PATH
for File in `ls ${LOCALPATH}`
do
ARCACT=${LOCALPATH}/${File}
od -bc ${ARCACT}|sed -n 'p;n'|sed 's/015/012/g'|awk '{$1=""; print $0}'|sed 's/ /\\/g'|awk '{printf $0;}'>${ARCACT}.TMP
printf "`cat ${ARCACT}.TMP`"|sed '/^$/d'>${ARCACT}
rm ${ARCACT}.TMP
done
exit 0
Вы можете просто сделать это:
$ echo $(cat input) > output
a * b
...