2015-11-11 2 views
2

Недавно я решил перейти от zsh к оболочке bash. Есть ли способ быстро преобразовать файл .zsh_history в файл .bash_history?Преобразование файла .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 

Пожалуйста, обратите внимание, что команда может занимать несколько строк.

+0

Похоже, что это возможно - было бы полезно, если бы вы включили образец ввода и желаемый результат. Вы пробовали что-нибудь, возможно, используя sed или awk? –

+0

Да, попробовал, но не мог заставить его работать легко. У них очень разные форматы в отношении метки времени, разделителей и т. Д. Ищите здесь, если кто-то сделал это раньше и имеет что-то удобное. – sdayal

+0

@sdayal, поскольку Том предлагает, чтобы нам было легче помочь вам, если вы включили фрагмент .zsh_history и ожидаемый результат .bash_history – andlrc

ответ

2

Это странно, я не те строки комментариев в моем .bash_history, во всяком случае, я хотел бы использовать что-то вроде этого

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

Я далек от того, специалист в области регулярных выражений, так что может быть но я объясню, что он делает.

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 
+2

Выглядит неплохо и приятно, но стоит упомянуть, что это зависит от версии sed, которая понимает '\ w' (например, GNU sed). Использование '-r' спасло бы вас от необходимости избегать групп захвата. –

+0

Спасибо за то, что Том, я не знал об этом флаге. –

+0

Что-то еще нужно сделать здесь, чтобы обрабатывать многострочные линии. – sdayal

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 
+0

Что-то еще нужно сделать здесь, чтобы обрабатывать многострочные линии. Кроме того, это не способно обрабатывать строки типа ': 1444493409: 0; git clone https: // github.com/xyz/abc.git' – sdayal

+0

Мой ответ работал с вашим исходным вводом - я вижу, что он изменился сейчас, но все еще нет многострочных записей. Если ваши требования более сложны, вы должны отредактировать ввод/вывод в своем вопросе. –

1

На MacOS я был в состоянии использовать следующее. Он правильно обрабатывает команды с двоеточиями, но я не уверен в многострочных командах.

awk -F'[:;] *' '{ st = index($0,";");printf "#%s\n%s\n", $2, substr($0,st+1)}' ~/.zsh_history > ~/.bash_history 
Смежные вопросы