Sedでキャプチャグループを繰り返す

Sedでキャプチャグループを繰り返す

次のスキーマがあります。

#ABC: (0),(0-11,22),(A7E2BB0F38DF),(42),(1A0290800D7),(7042),(81A0290800D7),(7442)

sedを使って次の結果を得たいと思います。

0 0-11,22 A7E2BB0F38DF 42 1A0290800D7 7042 81A0290800D7 7442

以下はbashで動作します:

result="#ABC: (0),(0-11,22),(A7E2BB0F38DF),(42),(1A0290800D7),(7042),(81A0290800D7),(7442)"
sed -n 's/.*(\(.*\)),(\(.*\)),(\(.*\)),(\(.*\)),(\(.*\)),(\(.*\)),(\(.*\)),(\(.*\))/\1 \2 \3 \4 \5 \6 \7 \8/p' <<< "$result"
0 0-11,22 A7E2BB0F38DF 42 1A0290800D7 7042 81A0290800D7 7442

今、このsed式をどのように最適化しますか?重複キャプチャグループを削除する方法は?

ベストアンサー1

大丈夫ですか?

% sed -Ee 's/[^(]*\(([^)]*)\)/\1 /g' < input.txt
0 0-11,22 A7E2BB0F38DF 42 1A0290800D7 7042 81A0290800D7 7442 

つまり、最初の開かれた括弧()[^(]*\(の前のすべての項目と一致([^)]*)し、閉じる括弧()以外のすべての項目をキャプチャし、閉じる括弧と一致し、バッチをキャプチャされた部分()に置き換え、残りの\1文字列(/g)。

またはPerlでは:

% perl -ne 'print "$1 " while(/\((.*?)\)/g); print "\n"' < input.txt
0 0-11,22 A7E2BB0F38DF 42 1A0290800D7 7042 81A0290800D7 7442 

おすすめ記事