LINUX.ORG.RU

регулярное выражение


0

0
Есть строка типа "aaabbb"

Подскажите плиз как с помощью регулярного выражения вырезать внутрннюю пару ab (но не всю строку) ??? Замучился уже читать на нему квалификаторов жадности и тд...

anonymous
Какие нафик квалификаторы жадности. s/ab// или s/aaabbb/aabb/ в зависимости от того, что ты хочешь конкретно. Хотя возможно я твоё желание не угадал, объяснил ты не чётко.
Teak ★★★★★
()
а если вырезать строку как она есть в виде AAABBB, а потом взять подстроку начиная со 2го элемента ?
Reset ★★★★★
()
Если я правильно тебя понял, у тебя повторяющаяся последовательность одного символа, за которым следует повторяющаяся последовательность другого символа, и тебе нужно вырезать то, что посередине, там где меняется символ?

Если так, то регексп может быть таким: "(.)\1*\1(.)\2*", а строка замены "\1\2". При этом предполагается, что первая последовательность должна иметь не менее 2-х символов.

uj2 ★★★
()
можно разбить строку на 3 части (2 по краям которые нужны, 1в центре нет)

$str = "aaabbb";

if($str =~ /(aa)(\S+)(bb)/) {
print "$1$3\n";
} else {
print "Not found\n";
}
x97Rang ★★★
()
Сорри забыл сказать - между любым из указанных выше символом может быть любое количество других(не 'a' и 'b') символов
anonymous
()
Ответ на: комментарий от anonymous
Типа "a*a*a*b*b*b" где * - любое количество любых (но не 'a' и не 'b') символов нужно вырезать именно центральный кусок a*b
anonymous
()
Ответ на: комментарий от anonymous
из "a*a*a*b*b*b" получается вырезать либо все (если жадность у регекспа включить) либо "a*a*a*b" если жадность выключить, а нужно "a*b"...

второй день бъюсь, ничерта не вы ходит, помогите плиз !

anonymous
()
Ответ на: комментарий от anonymous
echo adfadgadgha123bdgbsgbsdfgbzxcv|sed -e "s/.*\(a[^b]*b\).*/\1/"

?
AS ★★★★★
()
Ответ на: комментарий от anonymous
> Типа "a*a*a*b*b*b" где * - любое количество любых (но не 'a' и не 'b') символов нужно вырезать именно центральный кусок a*b

s/(a[^ab]*a[^ab]*)(a[^ab]*b)([^ab]*b[^ab]*b[^ab]*)/$1$3/

Хотя опять не гарантирую, что правильно нателепатил твои потребности. В частности, если под "любым количеством" понимается всё же ненулевое количество символов, отличных от a и b, то * везде заменить на +.

Teak ★★★★★
()
s/(.*)a.*?b(.*)/$1$2/;
anonymous
()
Ответ на: комментарий от anonymous
> на поставленный вопрос существует единственный ответ: /.*(ab).*/

Ну-ну. Проверил бы хоть:

$ echo adfadgadgha123bdgbsgbsdfgbzxcv|sed -e "s/.*\(ab\).*/\1/"
adfadgadgha123bdgbsgbsdfgbzxcv

двоечник. :-) у тебя не хватает [^b]* между a и b. Я же уже написал ответ: sed -e "s/.*\(a[^b]*b\).*/\1/" и привёл пример, как проверить:

$ echo adfadgadgha123bdgbsgbsdfgbzxcv|sed -e "s/.*\(a[^b]*b\).*/\1/"
a123b

AS ★★★★★
()
Ответ на: комментарий от AS
але, чемодан с гвоздями, был задан вопрос:

> Есть строка типа "aaabbb"

На эту подстроку существует однозначный ответ.
vilfred ☆☆
()
Ответ на: комментарий от vilfred
еслиб ему хотелось увековечить строки aaaab#$%aaBaabAAAAqwweaba тогда был бы другой разговор, но ведь аффтар нам сообщил о строке "ааааbbbb", ну и досвидания...
vilfred ☆☆
()
Ответ на: комментарий от vilfred
Лучше, сначала, дочитать до конца. Цитата:

**
*Типа "a*a*a*b*b*b" где * - любое количество любых (но не 'a' и не 'b') *символов нужно вырезать именно центральный кусок a*b
*
*anonymous (*) (28.01.2007 21:56:17)
**

В общем, было уточнение. :-)

AS ★★★★★
()
Ответ на: комментарий от josephson
> %cat test0.sh
> #!/bin/sh
> echo 'acdanmaaaefbklbbbpqb'|sed -e "s/.*(a[^b]*b).*/$1/"

> Ы?..

Ы-гы. $1 - это у тебя первый параметр для test0.sh (хотя sh не пользуюсь, точно не скажу). У sed результат от () не $n, а \n, это раз.
А два - перед "(" и ")" поставь \. Я же написал:

s/.*\(a[^b]*b\).*/\1/

$ cat qqwwee
#!/bin/sh
echo 'acdanmaaaefbklbbbpqb'|sed -e "s/.*\(a[^b]*b\).*/\1/"
$ ./qqwwee
aefb

Хотя, может, это FreeBSD такая странная ? ;-) Впрочем, сомневаюсь, что в ней дело.
AS ★★★★★
()
а если слегка изменить условия задачи ? пусть 'b' это не один символ а последовательность скажем 'bzx' ? ведь [^b] в этом случае работать не будет...
anonymous
()
Ответ на: комментарий от anonymous
Выражение [^b]* по логике означает, что между пограничными 'a' и 'b' может находиться неопределённое количество символов, исключая 'b', и на последовательность, 'b' или 'bzx' будет далее в скобках, не повлияет.
josephson ★★
()
Ответ на: комментарий от josephson
%cat test.pl
#!/usr/bin/perl
$Line='acdanmaaaefbzxklbbbpqb';
$Line=~s/.*(a.[^b]*bzx).*/\1/;
print "$Line\n";

%./test.pl
aefbzx
josephson ★★
()
Ответ на: комментарий от josephson
> Выражение [^b]* по логике означает, что между пограничными 'a' и 'b' может находиться
> неопределённое количество символов, исключая 'b'

Именно так. А "a" исключатся за счёт .*a, то есть, их тоже не будет.

> и на последовательность, 'b' или 'bzx' будет далее в скобках, не повлияет.

ТАк по условию "между последней a и первой b". А если ограничителем хочется сделать bzx, но включить b, то надо zx просто за скобку вынести:


s/.*(a.[^b]*b)zx.*/\1/



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