다음과 비슷한 데이터가 있습니다.
BLACK Harry<-George->Edna<-$$$Tom<-Tom->Phil<-Tue"
이 경우에 사용하려는 데이터는 다음과 같습니다.
해리<-조지->에드나<-
톰<-톰->필<-
내 명령은 현재 다음과 같습니다
sed 's!.*\(\([A-Z][a-z]*[-><][-<>]\)\{3\}\).*!\1!'
.*
내 이해는 (탐욕)을 사용할 때 가장 긴 일치가 필요 하고 전후의 모든 것을 대체한다는 것입니다.
이제 내 결과는 다음과 같습니다.
톰<-톰->필<-
패턴의 첫 번째 발생을 다른 그룹에 추가하려면 어떻게 해야 합니까?
답변1
$ 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
Bruce Barnett의 책에서 찾을 수 있습니다.유닉스 마법의 책.
답변2
문자, 보다 작음, 보다 큼, 하이픈 및 하나 이상의 하이픈을 일치시키려는 것 같습니다.
grep -Eo '[[:alpha:]<>-]+-[[:alpha:]<>-]+' <<END
BLACK Harry<-George->Edna<-$$$Tom<-Tom->Phil<-Tue"
END
Harry<-George->Edna<-
<-Tom->Phil<-Tue
답변3
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