地方エンジニアの学習日記

興味ある技術の雑なメモだったりを書いてくブログ。たまに日記とガジェット紹介。

【Bash】sedの最短一致

$ echo "<aaa>b<ccc> <ddd>e<ccc>"

という文が会った時にbというのを取り出したいケースで以下のようにsedを使おうとするとb以外の不要な部分まで取れてしまう。

$ echo "<aaa>b<ccc> <ddd>e<ccc>" | sed -r 's/<aaa>(.*)<ccc>/\1/'
b<ccc> <ddd>e

これはsedが最短一致ではなく最長一致がデフォルトで機能するためでそしてsedには最短一致なるものが機能として存在しない。なので以下のように次の<の出現でパターンマッチをいったん終了させると言った処理を書く必要がある。これで最短一致が実現可能。

echo "<aaa>b<ccc> <ddd>e<ccc>" | sed -r 's/<aaa>([^<]*).*$/\1/'
b

特定タグの中身だけ欲しいみたいなケースで使える。

echo "<html>aaa</htm><tag>bbb</tag><test>ccc</test>" | sed -r 's/^.*<tag>([^<]*).*$/\1/'
bbb