[Linux] grep нежадный вариант регулярного выражения

migel

Пусть есть строка:
"a1234ttt567bcbcbc"
я хочу grep'ом из нее выделить все что между a и первым bc.
пишу
grep -e "a.*bc"
и он берет по максимуму (т.е. a1234ttt567bcbcbc как этого избежать?
(сделать так чтобы оставалось a1234ttt567bc)

artimon

Упс, соврал.

BARSUK

вроде, так: "a.*?bc"

AlexV769

man grep: -o

migel

нет, так не работает.
более того, не совсем понятно почему должно работать (не понимаю зачем символ "?")
вот что в мане написано про него
A regular expression may be followed by one of several repetition operators:
? The preceding item is optional and matched at most once.

migel

man grep: -o
что значит ": -o" не понял, но ман по грепу читал. Про нежадные варианты выражений ничего не нашел.

migel

Упс, соврал.

только я хотел ответить " " =)

AlexV769

опция -o
>grep --version
grep (GNU grep) 2.5.1-FreeBSD
Copyright 1988, 1992-1999, 2000, 2001 Free Software Foundation, Inc.
This is free software; see the source for copying conditions. There is NO
warranty; not even for MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.

artimon

Это он по аналогии с перловыми регекспами написал.
В man grep слово greedness вообще не встречается, так что есть подозрение, что надо смотреть на awk/sed/perl…

procenkotanya

мб grep -o -P "a.*?bc" (-o — не строки, а только подходящие подстроки, -P - использовать Perl-regexp'ы, ? - чтобы .* стала нежадной)
хм, странно, у меня на grep -P grep (2.5.1) отвечает "The -P option is not supported". Так и должно быть?

Ivan8209


sed -re 's/a[^b]|b[^c])*)bc/\1/'

---
"Аллах не ведёт людей неверных."

laralat2

Это... А разве греп вообще такое могет? Он разве не со строками работает? По делу - по идее то что контра написал должно работать.

Ivan8209


$ sed --version
GNU sed version 4.1.4

---
...Я работаю антинаучным аферистом...

Ivan8209

Упустил.
> (сделать так чтобы оставалось a1234ttt567bc)

sed -re 's/^[^a]*(a[^b]|b[^c])*)bc).*$/\1/'

---
"Аллах не ведёт людей неверных."
Оставить комментарий
Имя или ник:
Комментарий: