У меня есть набор файлов, которые содержат заметки, написанные в обратном порядке:

###### 27/07/2016-15:04:20 GMT+1:
Really? More? 

###### 27/07/2016-15:04:18 GMT+1:
It happened again! 

###### 27/07/2016-15:04:16 GMT+1:
A thing happened

Я бы хотел, чтобы они появились в таком порядке:

###### 27/07/2016-15:04:16 GMT+1:
A thing happened

###### 27/07/2016-15:04:18 GMT+1:
It happened again! 

###### 27/07/2016-15:04:20 GMT+1:
Really? More? 

Некоторые из этих файлов содержат пару сотен записей - как проще всего это сделать?

2 ответа2

3

Только так

Команда tac может сделать это.

$ tac -b -s "######" file.log

Call Tac от Vim

Если вы хотите запустить его в Vim:

:%!tac -b -s "\#\#\#\#\#\#"

% означает все строки.

! запускает внешнюю команду.

Обратная косая черта необходима для экранирования знака # в "\#\#\#\#\#\#" .

Только Vim

Эти команды заменяют новую строку на вкладку. Если вкладка присутствует в журнале, используйте другой символ вместо вкладки.

:%s/\n/\t/g
:%s/\t######/\r######/g
:g/^/m0
:%s/\t/\r/g
1

Если в конце есть последний символ новой строки, следующая команда делает то, что вы хотите в Vim:

g/^###/.,/^$/m 0

При поиске строк, начинающихся с ### берется диапазон от ### до следующей пустой строки и перемещается в начало.

Если окончательного перевода строки нет, он, вероятно, прервется, например, E16: invalid range , в этом случае вы можете настроить регулярное выражение следующим образом:

g/^###/.,/\(^$\|\%$\)/m 0

Однако из-за отсутствия последней строки первая запись впоследствии не будет иметь новой строки, поэтому, в конце концов, может быть проще просто добавить одну пустую строку, добавить конец и использовать первую команду.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .