LINUX.ORG.RU

Regexp. Как найти вхождения, в которых нет заданной строки?


0

1

Мне нужно во всех строках в некотором файле найти строки, в которых нет строки ".ru" Что пробую:

egrep -E '.ru' text.file
правильно выводит те строки, которые выводить НЕ надо

Пытаюсь:

egrep -E '\(?!.ru\)' text.file
вобще ничего не выводит? ЧЯНТД?



Последнее исправление: abr_linux (всего исправлений: 1)
$ man egrep | grep invert
invert
       -v, --invert-match
              for each input file.  With the -v,  --invert-match  option  (see
              greater  than NUM.  When the -v or --invert-match option is also
anonymous
()
Ответ на: комментарий от anonymous

Всё бы хорошо, но как теперь мне ето с sed связать? Необходимо заменить все строки, в которых нет ".ru" на другую строку. У sed разве есть такой инвертирующий модификатор?

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

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

anonymous
()
Ответ на: комментарий от anonymous

Даётся любой файл, я его построчно читаю. Необходимо отсеить те строки, в которых есть вхождение ".ru" при помощи только регекспа. Собственно, ето и требуется.

abr_linux
() автор топика
Ответ на: комментарий от abr_linux
egrep -v '.ru' text.file | sed 's/qwe/asd/'

Или попробуем сформулировать задание по точнее. Есть файл:

$ cat text.file
qqqqq
rrrrr .ru 5
wwwww
на выходе хочется получить: ...

anonymous
()
Ответ на: комментарий от anonymous

Файл может быть любым, я хочу не просто задание решить (тем более, оно объёмное), а чтобы я понял, в чём я туплю. Но, хорошо, уговорили, берём пример:

Файл:

http://abrakadabra.ru
yandex.ru/eee
deutch.com/dghfs/4343
fin.fi/sdfdf/fdnkfd

На выходе необходимо получить:

deutch.com/dghfs/4343
fin.fi/sdfdf/fdnkfd

Причём, етот регексп планируется использовать потом и в sed и в php при помощи preg_match, поетому я и прошу объяснить, как можно сделать отрицание при помощи только регекспа, а не при помощи ключей и модификаторов команд.

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

В общем, насколько я понял, для каждой команды, которая использует regexp необходимо использовать свой модификатор отрицания. Вопрос в целом закрыт, но всё же интересно, неужели сам регекс не умеет отрицать подобным образом?

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

да умеет, просто regexp regexp-у рознь:

$ cat text.txt 
http://abrakadabra.ru
yandex.ru/eee
deutch.com/dghfs/4343
fin.fi/sdfdf/fdnkfd

$ grep -P '.*\.(?!ru).*' text.file
deutch.com/dghfs/4343
fin.fi/sdfdf/fdnkfd
все пишется исходя из задачи

anonymous
()
Ответ на: комментарий от abr_linux

Сам регексп не умеет. Некоторые реализации содержат расширения, позволяющие такое делать.

Подобные выражения писать довольно таки сложно. Вот пример выражения проверяющего на отсутствие подстроки 'ab':

^([^a]*|([^a]*(a[^b][^a]*)+[^ab]*))$

Что прийдётся написать для более длинной строки я даже не берусь оценить.

k_andy ★★★
()
Ответ на: комментарий от k_andy

писать довольно таки сложно.

Дык, лучше диаграмкой КА написать - и строить отрицание. И, емнип, алгоритм не заставляет особо задумываться (если без оптимизаций).

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