LINUX.ORG.RU

grep/egrep и перевод строки

 


0

1

Подскажите плиз считает ли grep/egrep символ перевода строки за символ, потому что прочитал в книге одной, что якобы он их удаляет(игнорирует) перед проверкой?



Последнее исправление: bario (всего исправлений: 1)

$ echo -e "aa\nbb\naabb"
aa
bb
aabb
$ echo -e "aa\nbb\naabb" | grep "aa"
aa
aabb
$ echo -e "aa\nbb\naabb" | grep aabb
aabb
$echo -e "aa\nbb\naabb" | grep "aa\nbb"

Ну а так, grep проверяет каждую строк на соответствие шаблону.

Можешь ещё почитать:

info grep
Возможно есть модификаторы, но сомневаюсь.

kostik87 ★★★★★
()
Последнее исправление: kostik87 (всего исправлений: 1)
Ответ на: комментарий от kostik87

ну меня интересует в контексте регулярных выражений, вот пример: C015501 4953693021 C015108 396543 16-05-14 10:03:56 0 34 имеется файл звонков с большим количеством таких вот строк и при попытке выбрать grep '\<34$' не находит ничего, а если поставить точку . после 34, тогда все в порядке и все строки, оканчивающиеся на 34 тут как тут. То есть получается, что символ перевода каретки не игнорируется (возможно в книге устаревшая информация, 2008 год все таки), потому что в редакторе цифра 4 это последний символ в строке, значит за ней идет перевод строки. Теперь уж боюсь доверять книге или нет), а то так изучишь неправильно)).

bario
() автор топика
Ответ на: комментарий от Elyas

я думал это одно и тоже, не знаю, чем это можно посмотреть даже

bario
() автор топика
Ответ на: комментарий от Elyas

Действительно, там 2 спецсимвола после 16, так и получается, что 1 игнорируется, а второй точка закрывает, значит литература не врала все таки)). Спасибо всем за помощь. В книге правильно написано, что на результат влияет хорошее знание исходного текста (+ знание спецсимволов наверно подразумевалось).

bario
() автор топика

Подскажите плиз считает ли grep/egrep символ перевода строки за символ, потому что прочитал в книге одной, что якобы он их удаляет(игнорирует) перед проверкой?

действительно, удаляет. Но не потому, что это «не символ», это обычный пробельный символ (матчиться [[:space:]]), а потому, что grep читает вход по одной строке до символа \n. Сам \n не входит в строку для матчинга.

С grep особо не повоюешь, но вот sed умеет жрать и много строк сразу, а потом их матчит. У неё есть даже специальный многострочный режим s///m.

Подробности в моей книжке. Ну или в info sed.

а если поставить точку . после 34, тогда все в порядке

это у тебя наверняка затесался \r из маздая. В маздае строки заканчиваются \r\n, а у нас просто \n. Потому и не матчится.

emulek
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.