将.zsh_history文件转换为.bash_history文件

时间:2015-11-11 09:53:25

标签: bash zsh

最近我决定从zsh迁移到bash shell。有没有办法快速将.zsh_history文件转换为.bash_history文件?

.zsh_history摘录

: 1446994188:0;cat .bash_profile
: 1446994197:0;echo $shell
: 1446995957:0;vi ~/.zshrc
: 1437893246:0;curl -fLo ~/.vim/autoload/plug.vim --create-dirs \\
    https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim

.bash_history摘录

#1446994188
cat .bash_profile
#1446994197
echo $shell
#1446995957
vi ~/.zshrc
#1437893246
curl -fLo ~/.vim/autoload/plug.vim --create-dirs https://raw.githubusercontent.com/junegunn/vim-plug/master/plug.vim

请注意,命令可以跨越多行。

4 个答案:

答案 0 :(得分:2)

很奇怪,我的.bash_history中没有这些注释的行,无论如何,我会用这样的东西

sed 's/^: \([0-9]*\):\w;\(.*\)$/#\1\n\2/' <.zsh_history >.bash_history

我远不是regexp的专家,所以可以做得更好,但我会解释它的作用。

 sed 's/^ -- start of the line
      :   -- tell the regexp there's a ":"
      \([0-9]*\) -- identify a series of numbers and store that in 1
      :\w; -- another ":" followed by a word and by ";" 
      \(.*\)$ -- store whatever you find until the end of the line in 2
      /#\1\n\2/' -- print what you have in 1 on a line and what you have in 2 on the next

答案 1 :(得分:2)

这个awk脚本似乎做了正确的事情:

awk -F'[:;] *' '{printf "#%s\n%s\n", $2, $4}' file

字段分隔符定义为分号或冒号,后跟任意数量的空格。然后打印两个感兴趣的领域,以及#和换行符。

在输入上测试它:

$ cat file
: 1446994188:0;cat .bash_profile
: 1446994197:0;echo $shell
: 1446995957:0;vi ~/.zshrc
$ awk -F'[:;] *' '{printf "#%s\n%s\n", $2, $4}' file
#1446994188
cat .bash_profile
#1446994197
echo $shell
#1446995957
vi ~/.zshrc

答案 2 :(得分:1)

在macOS上,我能够使用以下内容。它使用冒号正确处理命令,但我不确定多行命令。

awk -F'[:;] *' '{ st = index($0,";");printf "#%s\n%s\n", $2, substr($0,st+1)}' ~/.zsh_history > ~/.bash_history

答案 3 :(得分:-1)

对于那些使用 MacOSX Catalina 的人,我能够通过创建一个从 .zsh_history 文件到 .bash_history 文件的符号链接来解决它。

简单地删除 .bash_history 然后:

sudo ln -sf .zsh_history .bash_history

它非常适合我。