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

sda*_*yal 5 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
Run Code Online (Sandbox Code Playgroud)

.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
Run Code Online (Sandbox Code Playgroud)

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

Alb*_*gni 4

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

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

我远不是正则表达式方面的专家,所以这可能会做得更好,但我会解释它的作用。

 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
Run Code Online (Sandbox Code Playgroud)

  • 看起来不错,解释也很好,但值得一提的是,这依赖于理解“\w”的 sed 版本(例如 GNU sed)。使用“-r”将使您不必转义捕获组。 (2认同)