Sed와 정규식, 같은 줄에 같은 패턴을 가진 두 개의 다른 그룹이 있습니까?

Sed와 정규식, 같은 줄에 같은 패턴을 가진 두 개의 다른 그룹이 있습니까?

다음과 비슷한 데이터가 있습니다.

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= 단어 문자

가장 좋은 소개는 sedBruce 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

관련 정보