Почему $ конца строки является привязкой, не работающей с командой grep, даже при том, что передняя сторона строки ^ привязка?

Для изменения sendmail конфигурации необходимо изменить sendmail.mc файл восстанавливание конфигураций. Этот материал находится в наше время в /etc/mail, и после редактирования /etc/mail/sendmail.mc необходимо работать make там (извините, установка может варьироваться вполне немного, необходимо будет вырыть в документацию).

20
30.12.2014, 01:11
5 ответов

Как упоминал @steeldriver, скорее всего, проблема вызвана другим стилем окончания строк, чем то, что ожидает grep.

Для проверки окончаний строк

Вы можете использовать hexdump, чтобы проверить, как точно отформатированы окончания строк. Я предлагаю использовать мой любимый формат :

hexdump -e '"%08_ad (0x%08_ax)    "8/1 "%02x ""   "8/1 "%02x "' -e '"    "8/1 "%_p""|"8/1 "%_p""\n"' masternospaces.txt

С выходом проверьте окончания строк : 0a -> LF, 0d -> CR. Очень быстрый пример может дать нечто подобное :

$ hexdump -e '"%08_ad (0x%08_ax)    "8/1 "%02x ""   "8/1 "%02x "' -e '"    "8/1 "%_p""|"8/1 "%_p""\n"' masternospaces.txt
00000000 (0x00000000)    4e 6f 20 43 4f 57 20 65   6e 64 69 6e 67 0d 0a 45    No COW e|nding..E
00000016 (0x00000010)    6e 64 69 6e 67 20 69 6e   20 43 4f 57 0d 0a          nding in| COW..

Обратите внимание на окончания строк в формате dos : 0d 0a.

Для изменения окончаний строк

Вы можете увидеть здесь или здесь для различных способов изменения окончаний строк с помощью различных инструментов, но для одноразового использования вы всегда можете использовать vi/vim :

vim masternospaces.txt
:set fileformat=unix
:wq

Для grep без изменения чего-либо

Если вы просто хотите, чтобы grep совпадал независимо от окончания строки, вы всегда можете указать окончания строк вот так:

grep 'COW[[:cntrl:]]*$' masternospaces.txt

Если показана пустая строка, вы можете проверить, действительно ли вы что-то подобрали, используя опцию -v опции cat :

grep 'COW[[:cntrl:]]*$' masternospaces.txt | cat -v

Мой личный любимый

Вы также можете как grep, так и стандартизировать вывод, используя -v :

sed -n '/COW^M*$/{;s/^M//g;p;};' masternospaces.txt

где ^M получается, набрав на клавиатуре Ctrl-V Ctrl-M.

Надеюсь, это поможет!

23
27.01.2020, 19:44

Хотя вы можете использовать «стандартный» синтаксис RegEx с grep (как в ответе @user43791), grep также имеет другие идентификаторы для обозначения границ ввода.

Сопоставители для начала и конца всей строки: \` (обратная галочка) (вместо ^) и \' (апостроф) ( вместо $).

Таким образом, для исходной команды вы должны использовать: grep "COW\'" masternospaces.txt

Примечание: также важно отметить, что ? и + будут рассматриваться буквально, если вы не экранируете их с помощью \? и \+ , чтобы сделать их аналогами селекторов в стиле RegEx.

Источник: grep синтаксис регулярного выражения

1
20.08.2021, 12:40

В BSD grep вам нужно экранировать "$" и заключить строку в двойные кавычки:

"COW\$"
-4
20.08.2021, 12:40

Еще один способ удалить \rперед grep:

... | dos2unix | egrep 'COW$' |...

Мне нравится, что это очень ясно, так как я не запоминаю такие вещи, как [[:cntrl:]]надолго.

4
20.08.2021, 12:40

Попробуйте эту команду:grep "COW"$ masternospaces.txt

-1
20.08.2021, 12:40

Теги

Похожие вопросы