ファイル形式が一貫していると仮定するとbash
、ファイルを1行ずつ読み取ることができ、指定された形式であるかどうかをテストしてから、変換を行います。
while IFS= read -r i; do [[ $i =~ ^#([0-9]{10})$ ]] && \
date -d@"${BASH_REMATCH[1]}"; done <file.txt
BASH_REMATCH
最初の要素が正規表現一致で最初にキャプチャされたグループである配列です=~
。この場合はエポックです。
ファイル構造を保持したい場合:
while IFS= read -r i; do if [[ $i =~ ^#([0-9]{10})$ ]]; then printf '#%s\n' \
"$(date -d@"${BASH_REMATCH[1]}")"; else printf '%s\n' "$i"; fi; done <file.txt
これにより、変更された内容がSTDOUTに出力され、ファイルに保存されます。例out.txt
:
while ...; do ...; done >out.txt
必要に応じて、元のファイルを置き換えることができます。
mv out.txt file.txt
例:
$ cat file.txt
#1472047795
ll /data/holding/email
#1472047906
cat /etc/rsyslog.conf
#1472048038
ll /data/holding/web
$ while IFS= read -r i; do [[ $i =~ ^#([0-9]{10})$ ]] && date -d@"${BASH_REMATCH[1]}"; done <file.txt
Wed Aug 24 20:09:55 BDT 2016
Wed Aug 24 20:11:46 BDT 2016
Wed Aug 24 20:13:58 BDT 2016
$ while IFS= read -r i; do if [[ $i =~ ^#([0-9]{10})$ ]]; then printf '#%s\n' "$(date -d@"${BASH_REMATCH[1]}")"; else printf '%s\n' "$i"; fi; done <file.txt
#Wed Aug 24 20:09:55 BDT 2016
ll /data/holding/email
#Wed Aug 24 20:11:46 BDT 2016
cat /etc/rsyslog.conf
#Wed Aug 24 20:13:58 BDT 2016
ll /data/holding/web
HISTTIMEFORMAT
シェル変数を調べて、書き込み時にフォーマットを制御します。