У меня есть регулярное выражение [1]

(/foo/bar/(GW|GREV)[^/]*).*

Я смог заставить это работать с GNU sed с

sed -n 's/\(\/foo\/bar\/\(GW\|GREV\)[^\/]*\).*/\1/p'

Но это был современный седан GNU, и я на Solaris 10 с древним седом. Может быть, это можно портировать, но это не в моих силах. У меня действительно есть Perl 5.8, поэтому мой вопрос: как мне напечатать соответствующую подгруппу в perl one liner?


[1] Суть в том, что я хочу сопоставить все каталоги, которые соответствуют форме / foo / bar / GWxxx, / foo / bar / GREVxxx, и распечатать этот корневой каталог. Поэтому для следующих строк я всегда получаю /foo/bar/GREV123 в качестве захваченной группы:
/foo/bar/GREV123
/foo/bar/GREV123/
/foo/bar/GREV123/etc

1 ответ1

1
perl -pe 's{^(/foo/bar/(GW|GREV)[^/]*).*?$}{$1}o'

Депарсированная версия:

LINE: while (defined($_ = <ARGV>)) {
    s[^(/foo/bar/(GW|GREV)[^/]*).*?$][$1]o;
}
continue {
   die "-p destination: $!\n" unless print $_;
}

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .