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//'
で追加した先頭の部分を削除して完了、という具合。