![Sed와 정규식, 같은 줄에 같은 패턴을 가진 두 개의 다른 그룹이 있습니까?](https://linux55.com/image/99957/Sed%EC%99%80%20%EC%A0%95%EA%B7%9C%EC%8B%9D%2C%20%EA%B0%99%EC%9D%80%20%EC%A4%84%EC%97%90%20%EA%B0%99%EC%9D%80%20%ED%8C%A8%ED%84%B4%EC%9D%84%20%EA%B0%80%EC%A7%84%20%EB%91%90%20%EA%B0%9C%EC%9D%98%20%EB%8B%A4%EB%A5%B8%20%EA%B7%B8%EB%A3%B9%EC%9D%B4%20%EC%9E%88%EC%8A%B5%EB%8B%88%EA%B9%8C%3F.png)
다음과 비슷한 데이터가 있습니다.
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