LINUX.ORG.RU

sed, моддификатор g и шаблоны регулярных выражений

 ,


0

1

Хочу убрать все AND кроме тех, что с # в строке типа:

 #AND bb AND bb AND

Тогда такая запись, даже с шаблоном

echo "#AND bb AND bb AND " | sed -e 's/\([^#]\)AND/\1UND/g'
#AND bb UND bb UND

а такая:

echo "#AND bb AND bb AND " | sed -e  's/\(\#AND.*\)AND\(.*\)/\1UND\2/g'
#AND bb AND bb UND

Требует сначала убирает один AND, а при повторном вызове sed второй.

При этом sed не против шаблонов. И модификатор g понимает. Но обходит строку как-то странно.

echo "#AND bb AND bb AND " | sed -e 's/\( \)AND\( \)/\1UND\2/g'
#AND bb UND bb UND 
echo "#AND bb AND bb AND " | sed -e 's/\(.*\)AND\( \)/\1UND\2/g'
#AND bb AND bb UND
echo "#AND bb AND bb AND " | sed -e 's/\(\)AND\(.*\)/\1UND\2/g'
#UND bb AND bb AND

Кто-нибудь понимает эту чертовщину?

При чем тут Development?

man sed

Ну или метла, швабра, вантуз...

anonymous
()

g продолжает поиск шаблона за концом предыдущего результата, а .* жадный и матчит по-максимуму. Поэтому по одному совпадению за раз.

xaizek ★★★★★
()

\( \)

Матчит пробел (но не таб и не любой другой пробельный символ).

g проходит по всем послепробельным и допробельным AND (уберёшь пробел в конце строки, и последний AND заменён не будет).

\(.*\)

Матчит всё, или всё, что можно, пока не упрётся в последний AND.

g ничего не остаётся или остаётся только последний AND.

\(\)

Матчит "ничто".

Но так как жадный .* в конце, для g ничего не осталось.

Кто-нибудь понимает эту чертовщину?

Никакой чертовщины. Что ты просил, то и получил. ☺

mord0d ★★★★★
()
Последнее исправление: mord0d (всего исправлений: 1)
echo "#AND bb AND bb AND " | sed -e 's/\([^#]\)AND/\1UND/g'

Да ну на!:

echo "#AND bb AND bb AND " | sed -e '/#/! s/AND/UND/g'
anonymous
()

Спасибо! Вроде бы понял.

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