grep для пошуку файлів, що містять ^ M (повернення каретки Windows)


72

Я використовую Linux. Десь приховано тисячі файлів конфігурації, і я мушу його знайти, бо він змушує сервер вийти з ладу.

Як знайти ^ M серед ієрархії каталогів, повної файлів конфігурації?

Я думаю, що я не можу ввести ^ M в командному рядку bash. Але я маю це у текстовому файлі, який я назвав m.txt



windows буде ^ M ^ J
барлоп

3
"Я не можу ввести ^ M у командному рядку bash". Так, ти можеш. Спробуйте control-V Control-M
Hennes

Відповіді:


91
grep -r $'\r' *

Використовуйте -rдля рекурсивного пошуку та $''для втечі в стилі c у стилі Bash.

Більше того, якщо ви впевнені, що це текстовий файл, то його слід безпечно запускати

tr -d $'\r' < filename

щоб видалити все \rу файлі.

Якщо ви використовуєте GNU sed, ви -iможете виконувати редагування на місці, тому не потрібно буде писати назад:

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

10
@Nicolas: Ви можете ввести ^ M в командному рядку, натиснувши ^ V ^ M, але краще використовувати $'\r'.
Денніс Вільямсон

Чудово, це працює! Дякую за хитрість ^ V ^ M теж :-)
Ніколас Раул

5
За Цигвіна, -У потрібен, щоб зробити цю роботу. І -n скаже вам номер рядка: grep -r -U -n -e $ '\ r'
Rainer Blome

4
Додайте -l до команди grep, щоб просто переглянути файли. Інакше вас можуть обстрілювати відповідні лінії.
Брендан Берд

1
@uprego не впевнений, чи ти зараз їх розумієш, але фей та інші, пошук $'прочитає перше звернення в manpage bash(1), в основному, ти можеш бачити це так, ніби пишеш C буквальний рядок. Що ж стосується command < filename, використання <або >називається перенаправленням , це перший раз , коли я бачив , щоб хто назвав його великим виразом . Шукати REDIRECTIONв bash(1).
livibetter

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 filenamegrep


2

Якщо я правильно розумію ваше запитання, то, що ви насправді хочете, це нормалізувати всі закінчення рядків на стандарт Unix LF ( \x0a). Це не те саме, що просто сліпо видаляти CR ( \x0d).

Якщо у вас є деякі файли Mac, навколо яких використовується лише CR для нових рядків, ви знищите ці файли. (Так, Маки повинні використовувати LF майже 20 років, але все ще є (у 2019 році) багато додатків для Mac, які використовують лише CR).

Ви можете використовувати \R рятувальний рядок Perl, щоб замінити будь-який новий рядок \n.

perl -i.bak -pe 's/\R/\n/g' $your_file

Це замінить на місці будь-який тип рядка з \nв $your_file, зберігаючи резервну копію вихідного файлу в ${your_file}.bak.


1

Щоб використовувати grep для символів кінця рядка, я думаю, ви повинні сказати grep, що файл є двійковим.

-l (літера L) призначена для друку лише імені файлу

-P призначений для perge regexp (так \ x0d перетворюється на \ r або ^ M)

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

0

Якщо ви перебуваєте на Mac і використовуєте домашню мову , ви можете:

brew install tofrodos
fromdos file.txt

для видалення всіх повернень каретки Windows з file.txt

Щоб повернутися до повернення каретки Windows,

todos file.txt

Для пошуку в папці та очищення всіх файлів, що надходять з dos, виконайте цю команду: find. -типу f -ім'я "* .java" | xargs fromdos
Тайко

0

У стилі регулярного вираження різні нові рядки:

Windows (CR LF)
\r\n

Unix (LF)
\n

Оскільки \r\nпослідовність досить унікальна, я думаю, ви повинні мати можливість шукати її саме таким чином?

Щоб погіршити ситуацію, раніше у Macs було просто "\ r" замість нового рядка. Я не можу це перевірити, але я не думаю, що покоління MacOSX це вже роблять.

Старіші Mac (CR)
\r


У каталозі, що містить m.txt, grep "\r\n" *результат не дає. Немає результату ні для, egrep -e "\r\n" *ніgrep -E "\r\n" *
Ніколас Раул

@nicolas ах, я неправильно зрозумів .. ти мав на увазі CR тільки \rмій поганий. Новий рядок повного вікна справді є \r\nабо CRLF
Джефф Етвуд

0

Дотримуючись попередніх відповідей, метод "tr" хороший:

533 $, якщо [[-n " tr -cd "\r" <~/.bashrc"]]; потім відлуння "DOS"; ще відлуння "UNIX"; фі

UNIX

534 $, якщо [[-n " tr -cd "\r" <dosfile.txt"]]; потім відлуння "DOS"; ще відлуння "UNIX"; фі

DOS

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.