Sedと正規表現、同じ行に同じパターンを持つ2つの異なるグループがありますか?

Sedと正規表現、同じ行に同じパターンを持つ2つの異なるグループがありますか?

次のようなデータがあります。

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の本にあります。Unix 魔法の本

答え2

文字、より小さい、より大きい、ハイフン、および1つ以上のハイフンを一致させようとしているようです。

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

関連情報