Sed и регулярное выражение, один и тот же шаблон в одной строке, две разные группы?

У меня есть некоторые данные, похожие на эти:

BLACK Harry<-George->Edna<-$$$Tom<-Tom->Phil<-Tue"

Данные, которые я хочу использовать используйте в этом случае:

Гарри <- Джордж-> Эдна <-

Том <-Tom-> Фил <-

Моя команда, на данный момент выглядит так:

sed 's!.*\(\([A-Z][a-z]*[-><][-<>]\)\{3\}\).*!\1!'

Я понимаю, что когда я использую . * (жадный) он берет самое длинное совпадение , а затем заменяет все до и после.

Таким образом, мой результат на данный момент только

Tom <- Tom-> Phil <-

Как мне добавить первое вхождение моего шаблона в другую группу?

0
16.12.2016, 14:01
3 ответа
$ echo 'BLACK Harry<-George->Edna<-$$$Tom<-Tom->Phil<-Tue' |
> sed -e 's/.*\b\(\w\+<-\w\+->\w\+<-\).*\b\(\w\+<-\w\+->\w\+<-\).*/\1\n\2/'
Harry<-George->Edna<-
Tom<-Tom->Phil<-
  • \ b = граница слова
  • \ w = символ слова

Лучшее введение в sed можно найти в UNIX Grymoire .

0
28.01.2020, 04:49

Похоже, вы хотите сопоставить буквы, меньше, больше, дефис хотя бы с одним дефисом:

grep -Eo '[[:alpha:]<>-]+-[[:alpha:]<>-]+' <<END
BLACK Harry<-George->Edna<-$$$Tom<-Tom->Phil<-Tue"
END
Harry<-George->Edna<-
<-Tom->Phil<-Tue
0
28.01.2020, 04:49
echo 'BLACK Harry<-George->Edna<-$$$Tom<-Tom->Phil<-Tue' |
sed -r '
s/(\b\w+<-\w+->\w+<-)([^\n])/\1\n\2/g  # seperate matchs with \n
s/.+(\b\w+<-\w+->\w+<-)/\1/Mg          # remove the front in each lines
/\b\w+<-\w+->\w+<-$/!s/[\n]?[^\n]*$//' # remove the last unmatch line if exist
0
28.01.2020, 04:49

Теги

Похожие вопросы