次のようなデータがあります。
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の本にあります。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