LINUX.ORG.RU

.*, но исключая подстроку

 


0

1

Привет, ночной ЛОР.

Ищу я выражение для sed: оно должно работать как .*, но при этом не включать в себя некоторую подстроку. Как [^c]*, но не для одного символа, а для их комбинации.

Есть такое?

★★★★★

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

Ответ на: комментарий от lazyklimm

Ты меня не понял

У меня есть сценарий, примерно такой:

s/\(%>.*\)nya\(.*<%\)/\1meow\2/g

И мне нужно вместо .* тут подставить сабж, чтобы оно нормально работало

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

Сложно как-то. Можно регэкспом, который умеет non-greedy (pcre, например): обе скобки нежадные, затем проверить, что во второй нет подстроки, заменить.

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

1. Поменять все (содержащие ненавистную подстроку и не содержащие), как у тебя нарисовано.
2. для той же строки (через ';') поменять обратно только содержащие.

ABW ★★★★★
()
$ echo -e '111\n222\n333' |sed -n '/222/!p'
111
333
anonymous
()
Ответ на: комментарий от derlafff

Могу предположить два варианта:

1.Взять, например, Perl, или ssed, или еще что-нибудь с поддержкой negative lookahead и поколдовать (см. пример wwwsevolod выше).

2.Использовать несколько команд. Сначала удалить все ненужные вхождения, а потом найти все остальные. Или сначала найти и вывести все вхождения, а потом из списка удалить ненужные.

А Аллах знает лучше.

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

Использовать несколько команд. Сначала удалить все ненужные вхождения, а потом найти все остальные. Или сначала найти и вывести все вхождения, а потом из списка удалить ненужные.

Мне вхождения нужно не удалять, а заменять

derlafff ★★★★★
() автор топика
Ответ на: комментарий от derlafff
sed '/regex/!s/\(%>.*\)nya\(.*<%\)/\1meow\2/g'

, где regex — рег. выр. для твоей «некоторой подстроки». Оно?

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

Что-то у меня не получается

$ echo 'nya<%snyad%>dfgnyadfgdg<%snya%><%%>' | perl -pe 's/(%>.*(?!<%))nya(.*(?!%>)<%)/\1meow\2/g'
nya<%snyad%>dfgnyadfgdg<%smeow%><%%>
derlafff ★★★★★
() автор топика
Ответ на: комментарий от wwwsevolod
echo 'nya<%snyad%>dfgnyadfgdg<%snya%><%%>' | perl -pe 's/(%>.*(?!<%))nya(.*[^%(?=>)]<%)/\1meow\2/g'
nya<%snyad%>dfgmeowdfgdg<%snya%><%%>
wwwsevolod
()
Ответ на: комментарий от wwwsevolod

Ан-нет. Заменяет только одно вхождение:

$ echo 'nya<%snyad%>dfnyagdnyafgdg<%snya%><%%>' | perl -pe 's/(%>.*[^<(?=%)])nya(.*[^%(?=>)]<%)/\1meow\2/g'
nya<%snyad%>dfnyagdmeowfgdg<%snya%><%%>
derlafff ★★★★★
() автор топика
Ответ на: комментарий от derlafff

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

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

может так получится?

echo -e 'nya<%snyad%>dnyafgnyadfgdg<%snya%><%%>\nqwe<asd>zxc<qwe><%%>' |
sed ':1;/\([^%]*%>\)\([^<]*\)nya\([^<]*\)\(.*\)/s/\([^%]*%>\)\([^<]*\)nya\([^<]*\)\(.*\)/\1\2meow\3\4/g;t1'

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

лучше проще:

echo -e 'nya<%snyad%>dnyafgnydfgdg<%snya%><%%>\nnya<%snyad%>dnyafgnyadfgdg<%snya%><%%>\nqwe<asd>zxc<qwe><%%>' |
sed ':1;s/\([^%]*%>[^<]*\)nya\([^<]*.*\)/\1meow\2/g;t1'

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