65

Я использую Linux. Где-то спрятано ^ M (возвращение кариеса Windows) где-то в тысячах файлов конфигурации, и я должен найти его, потому что это приводит к сбою сервера.

Как найти ^ M среди иерархии каталогов, полной конфигурационных файлов?

Я думаю, что я не могу ввести ^ M в командной строке bash. Но у меня есть это в текстовом файле, который я назвал m.txt

7 ответов7

85
grep -r $'\r' *

Используйте -r для рекурсивного поиска и $'' для выхода в стиле c в Bash.

Более того, если вы уверены, что это текстовый файл, то он должен быть безопасным для запуска

tr -d $'\r' < filename

удалить все \r в файле.

Если вы используете GNU sed , -i может выполнять редактирование на месте, поэтому вам не нужно писать обратно:

sed $'s/\r//' -i filename
12

Когда я попытался, я мог сказать, что это вроде как работает, но строки печатались пустыми. Добавьте в опцию:

--color=never

Если у вас возникла эта проблема, я думаю, что это экранирующие символы для выделения цвета, мешающие символу \r .

2

Если на вашем сервере нет оболочки bash, альтернативой является использование опции -f в grep в сочетании с подготовленным файлом, содержащим \r .

Чтобы создать файл:

$ echo -ne '\r' > /tmp/cr                    --or--                   $ printf '\r' > /tmp/cr

$ od -c /tmp/cr
0000000  \r
0000001

На самом деле сделать поиск

$ grep -f /tmp/cr *.html *.php *.asp *.whatever

или вы можете быть немного ленивым и просто набрать *,

$ grep -f /tmp/cr *

Параметр -f filename в grep используется для указания файла, который содержит шаблоны для сопоставления, по одному на строку. В этом случае есть только один шаблон.

1

Чтобы использовать grep для символов конца строки, я думаю, вы должны указать grep, что файл является двоичным.

-l (буква L) предназначена для печати только имени файла

-P для регулярного выражения perl (поэтому \x0d преобразуется в \r или ^ M)

grep -l --binary -P '\x0d' *
0

Если вы работаете на Mac и используете homebrew, вы можете сделать:

brew install tofrodos
fromdos file.txt

удалить все возвраты каретки Windows из файла file.txt

Чтобы вернуться к возврату каретки Windows,

todos file.txt
0

Следуя предыдущим ответам, метод 'tr' хорош:

533 $ if [[-n " tr -cd "\r" <~/.bashrc "]]; затем эхо "DOS"; еще эхо "UNIX"; фи

UNIX

534 $ if [[-n " tr -cd "\r" <dosfile.txt "]]; затем эхо "DOS"; еще эхо "UNIX"; фи

DOS

0

В стиле регулярных выражений, различные новые строки:

Windows (CR LF)
\r\n

Unix (LF)
\n

Поскольку последовательность \r\n довольно уникальна, я думаю, вы сможете найти ее таким образом?

Что еще хуже, на Маках раньше был символ «\r» вместо новой строки. Я не могу проверить это, но я не думаю, что поколения MacOSX делают это больше.

Старые Маки (CR)
\r

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .