次のスキーマがあります。
#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