Какой самый эффективный способ многократного удаления начального текста с помощью Vim? - PullRequest
6 голосов
/ 07 апреля 2010

Какой самый эффективный способ удаления текста 2010-04-07 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.

Ответы [ 6 ]

13 голосов
/ 07 апреля 2010

Запустите команду: :%s/.* - //

Редактировать, объяснение:

%: whole file
s: subsitute
.* - : find any text followed by a space a dash and a space.
// : replace it with the empty string.
6 голосов
/ 07 апреля 2010

Вы также можете использовать режим визуального блока, чтобы выбрать все символы, которые вы хотите удалить:

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
2 голосов
/ 07 апреля 2010

Мое решение будет:

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]

Затем просто удерживайте <at>, пока не закончите, и позвольте автоматическому повтору нажатия клавиши сделать всю работу за вас.

Примечание:
Несмотря на то, что записанные макросы не всегда являются самым быстрым и наиболее совершенным инструментом для работы, часто проще записать и выполнить макрос, чем искать что-то лучшее.

1 голос
/ 07 апреля 2010

Самый простой способ - использовать макрос. Нажмите qa, чтобы начать запись в регистр a. Затем удалите символы, как вы привыкли в Vim. Нажмите q, чтобы остановить запись. Затем возьмите количество строк и добавьте @a, например, к 4, нажмите 4@a. Это будет повторять макрос 4 раза.

0 голосов
/ 07 апреля 2010

:%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 This is a debug log statement | 9,8

Тогда использование :%s/.* - // не сработает.

Объяснение для регулярного выражения:

.\{-} соответствует любому значению, за исключением новых строк, как можно меньше

\ze прекращает сопоставление, поэтому замена не влияет на следующие символы

\d\+,\d\+$ цифр, по крайней мере, одна, за которой следует запятая, за которыми следуют цифры, по крайней мере, одна, и конец строки

Естественно, это не работает, если формат желаемых значений в конце строки ошибочен, и в этом случае другие решения работают, если строки до значений имеют одинаковую длину или разделители одинаковы.

0 голосов
/ 07 апреля 2010

Вы можете сделать:

1,$s/.*- //
  • 1: строка 1
  • $: последняя строка
  • s: замена
  • .*: что угодно

Таким образом, в каждой строке заменяется все, что следует за дефисом и пробелом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...