Bash

Linux・Bashコマンドで正規表現で並び替え(ソート)する方法

以下のような出力のうち、日付の部分でソートしたい、という場合。

$ skd-check 14
INFO: You have 5 tasks in this 14 days.


# note:: rapidgator 解約 :skd:7/13
# note:: ごみすて もえないごみ :skd:7/19
# note:: something :skd:7/6T12:00
# note:: 図書館 本返却 :skd:7/15

以下のような感じ。


$ skd-check 14 | python3 -c "import sys,re,json; print( re.sub(r'.*\s:(skd|schedule):(\d{1,2}(-|\/)\d{1,2}[?]?(T[0-9]{1,2}:[0-9]{1,2})?[?]?).*', '\g<2>\t\g<0>', sys.stdin.read()) )" | sort -V | sed 's/\S*\t//' INFO: You have 5 tasks in this 14 days. # note:: something :skd:7/6T12:00 # note:: rapidgator 解約 :skd:7/13 # note:: 図書館 本返却 :skd:7/15 # note:: ごみすて もえないごみ :skd:7/19

理屈としては、まず正規表現で都合のいいところをグループして行の先頭に持ってきます。そして次にタブなどで区切ってから全体マッチをペースト。
今回は正規表現としてPythonを使ってますが、簡単なものならsedでもいいでしょう。

そして以下のような出力となります。

$ skd-check 14 | python3 -c "import sys,re,json; print( re.sub(r'.*\s:(skd|schedule):(\d{1,2}(-|\/)\d{1,2}[?]?(T[0-9]{1,2}:[0-9]{1,2})?[?]?).*', '\g<2>\t\g<0>', sys.stdin.read()) )"
INFO: You have 5 tasks in this 14 days.


7/13    # note:: rapidgator 解約 :skd:7/13
7/19    # note:: ごみすて もえないごみ :skd:7/19
7/6T12:00       # note:: something :skd:7/6T12:00
7/15    # note:: 図書館 本返却 :skd:7/15

次にsort -Vで先頭の数値部分を参考にソートされます。最後にsed 's/\S*\t//'で追加した先頭の部分を削除して完了、という具合。

linux – Bash sort by regexp – Stack Overflow