Что самый эффективный путь состоит в том, чтобы удалить текст 07.04.2010 14:25:50 773 ОТЛАДКИ, Это - оператор журнала отладки - от файла журнала как извлечение ниже использования Vim?
2010-04-07 14:25:50,772 DEBUG This is a debug log statement - 9,8 2010-04-07 14:25:50,772 DEBUG This is a debug log statement - 1,11 2010-04-07 14:25:50,772 DEBUG This is a debug log statement - 5,2 2010-04-07 14:25:50,772 DEBUG This is a debug log statement - 8,4
Это - то, на что должен быть похожим результат:
9,8 1,11 5,2 8,4
Обратите внимание, что в этом случае я использую gVim в Windows, поэтому не предлагайте программы UNIX, которые могут лучше подходить для задачи — я должен сделать это с помощью Vim.
Выполните команду: :% s /.* - //
Редактировать, объяснение:
%: whole file
s: subsitute
.* - : find any text followed by a space a dash and a space.
// : replace it with the empty string.
Вы можете:
1,$s/.*- //
1
: строка 1 $
: последняя строка s
: подстановка . *
: что угодно Таким образом, он заменяет в каждой строке все, что сопровождается дефисом и пробелом, ничем.
Самый простой способ - использовать макрос. Нажмите qa
, чтобы начать запись в регистре a
. Затем удалите символы, как вы привыкли в Vim. Нажмите q
, чтобы остановить запись. Затем возьмите количество строк и добавьте @a
, например, для 4 нажмите 4 @ a
. Это повторит макрос 4 раза.
Вы также можно использовать режим визуального блока для выбора всех символов, которые вы хотите удалить:
gg Go to the beginning of the file
Ctrl-v Enter visual block mode
G Go to the end of the file
f- Go to dash
<right> Go one more to the right
d Delete the selected block
:% s /. \ {-} \ ze \ d \ +, \ d \ + $ //
Эта команда работает путем привязки к числам, разделенным запятыми в конце строки, поэтому он работает, даже если все остальное, кроме этих чисел в строке, изменится .
Метод визуального блока, вероятно, является самым простым решением, и я бы его использовал. Но это не сработает, если строки будут располагаться в шахматном порядке, например:
2010-04-07 14:25:50,772 DEBUG This is a debug log statement - 9,8 2010-04-07 14:25:50,772 DEBUG This is another debug log statement - 9,8
Разделитель также может измениться на другой символ, поэтому строка будет выглядеть так:
2010-04-07 14:25: 50,772 DEBUG Это оператор журнала отладки | 9,8
Тогда использование :% s /.* - //
не сработает.
Объяснение для регулярного выражения:
. \ {-}
соответствует любому, исключая символы новой строки, как можно меньше
\ ze
прекращает сопоставление, поэтому замена не влияет на следующие символы
\ d \ +, \ d \ + $
цифры, по крайней мере, одна, за которой следует запятая, за которой следуют цифры, по крайней мере, одна, и конец строки
Естественно, это не работает, если формат желаемых значений в конце строки является нестабильным, и в этом случае другие решения работают, если строки до значений имеют одинаковую длину или одинаковые разделители.
Мое решение:
qa [start recording in record buffer a]
^ (possibly twice) [get to the beginning of the line]
d3f- [delete everything till - including]
<del> [delete the remaining space]
<down> [move to next line]
q [end recording]
<at>a [execute recorded command]
Затем просто удерживайте
, пока не закончите, и позвольте автоматическому повторению клавиш сделать всю работу за вас.
Примечание:
Хотя записанные макросы не всегда могут быть самым быстрым и идеальным инструментом для работы, часто проще записать и выполнить макрос, чем искать что-то получше.