sedで置換条件に最短一致を指定したい事があったので、備忘で残しておく。
残念ながらsedでは最長一致が基本で、最短一致の指定方法は用意されていない。
このため、以下のように「^
」と組み合わせて開始文字列を指定して正規表現を記述してやることで、最短一致を指定する。
echo "abc<b>123</b>def<b>456</b>ghi" | sed 's|<[^<]*>||g' # 例1) <> で囲んでる範囲だけ対象にする
echo "abc<b>123</b>def<b>456</b>ghi" | sed 's|<b[^<]*</b>||g' # 例2) <b>~</b>で囲んでる範囲だけ対象にする
blacknon@BS-PUB-UBUNTU-01:~$ echo "abc<b>123</b>def<b>456</b>ghi" | sed 's|<.*>||g' # 例) そのままだと最長一致
abcghi
blacknon@BS-PUB-UBUNTU-01:~$ echo "abc<b>123</b>def<b>456</b>ghi" | sed 's|<[^<]*>||g' # 例1) <> で囲んでる範囲だけ対象にする
abc123def456ghi
blacknon@BS-PUB-UBUNTU-01:~$ echo "abc<b>123</b>def<b>456</b>ghi" | sed 's|<b[^<]*</b>||g' # 例2) <b>~</b>で囲んでる範囲だけ対象にする
abcdefghi
sedの代わりにPerlを使う場合、最短一致は対応しているので、以下のように正規表現を記述してやればいい。
echo "チン<small>す</small>コ<small>う</small>" | perl -pe 's|<small.*?/small>||g'
blacknon@BS-PUB-UBUNTU-01:~$ echo "チン<small>す</small>コ<small>う</small>" | perl -pe 's|<small.*?/small>||g'
チンコ