I want to convert the timestamps in a .zsh_history
file to their readable equivalents.
Is there some search and replace I can do in emacs that will replace the time with something like (format-time-string unixtime)
?
: 1568128379:0;cp -a ~/.zshrc.pre-oh-my-zsh ~/.zshrc
: 1568128381:0;exit
This same question was asked in stack exchange: https://emacs.stackexchange.com/questions/79221/is-it-possible-for-a-query-replace-regex-to-replace-the-value-with-a-computed-va
Yes, I know it’s the same guy.
And how is this a meaningful answer to the question?
Is there some rule that questions asked here shouldn’t be asked on stackexchange too?
C-h a replace-regexp
, select the function, and look at its help string.The solution will end up looking something like:
M-x replace-regexp : \([0-9]+\):\(.*\) \,(+ 1 \#1):\2
But with
(format-time-string)
instead of my(+1 1 \
; I don’t know time formatting functions in emacs elisp off the top of my head, sorry.(Or use
query-replace-regexp
if you want interactivity.)Here is the solution for my
.zsh_history
example:I first created a small function for the unix time string. More of the functionality in the replacement string can be included if preferred.
(defun rgx-get-time-string (unixtimestr) (format-time-string "%Y-%m-%d %H:%M" (string-to-number unixtimestr)) )
The search string:
\(: \)\([0-9]\{10\}\)\(:0;\)
The replacement string:
\,(concat (format "%6d " (line-number-at-pos)) (rgx-get-time-string (match-string 2)) " "))
(match-string 2)
is an alternative for the back reference for the second string matched\2