У меня есть некоторые данные, похожие на эти:
BLACK Harry<-George->Edna<-$$$Tom<-Tom->Phil<-Tue"
Данные, которые я хочу использовать используйте в этом случае:
Гарри <- Джордж-> Эдна <-
Том <-Tom-> Фил <-
Моя команда, на данный момент выглядит так:
sed 's!.*\(\([A-Z][a-z]*[-><][-<>]\)\{3\}\).*!\1!'
Я понимаю, что когда я использую . *
(жадный) он берет самое длинное совпадение , а затем заменяет все до и после.
Таким образом, мой результат на данный момент только
Tom <- Tom-> Phil <-
Как мне добавить первое вхождение моего шаблона в другую группу?
$ 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 .
Похоже, вы хотите сопоставить буквы, меньше, больше, дефис хотя бы с одним дефисом:
grep -Eo '[[:alpha:]<>-]+-[[:alpha:]<>-]+' <<END
BLACK Harry<-George->Edna<-$$$Tom<-Tom->Phil<-Tue"
END
Harry<-George->Edna<-
<-Tom->Phil<-Tue
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