2014-05-28 4 views
0

Я не уверен, что именно происходит здесь, но я пытался удалить некоторые данные из файла с помощью vim. Данные - 6 разделенных запятыми значений. Я хочу удалить последние три из каждой строки. Я использовал регулярное выражение find replace %s/,[0-9]*,[0-9]*,[0-9]*$//g. Я использую его на следующие данных:Поведение регулярных выражений Strange vim

7.95630550,-3.53701925,-1.04588318,52,40,40 
2.60749245,-3.85793233,0.43392944,77,41,19 
10.12495995,1.63384104,1.23306274,40,31,42 
10.14402199,-3.11163330,1.23091125,40,29,36 
-0.49531555,-3.59129953,-1.24293518,62,53,52 

И я получаю это:

7.95630550,-3.53701925,-1.04588318 
2.60749245,-3.85793233,0.43392944 
10.12495995,1.63384104,1.23306274,40,31,42 
10.14402199,-3.11163330,1.23091125,40,29,36 
-0.49531555,-3.59129953,-1.24293518 

Таким образом, некоторые из данных удаляются, но по какой-то причине, данные в этих других линиях не удаляются. Это происходит по всему файлу, и я не вижу какой-либо описываемой картины? Что-то не так с моим выражением?

+2

Возможно, что на этих двух линиях пробегают пробелы. –

ответ

1

этого regex должен работать, если количество полей постоянно, как это поиск с начала строки.

:g/\(.\{-}\zs,\)\{3}/normal nd$ 

На каждой линии идут 3 вхождение в , и удалить до конца строки.

+0

Да, это сработало. Спасибо –

0

Вы упускаете звездочку на последней, и вам не нужно/г в конце:

:%s/,[0-9]*,[0-9]*,[0-9]*$// 

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

:%s/,[0-9]\+,[0-9]\+,[0-9]\+$// 
+0

Эй, извините, это просто опечатка в написании вопроса. Нет * означало бы, что ни одна из строк не работала. –

+0

Также предложенные вами изменения не работают. Может быть, форматирование строк? –

+0

Возможно, если у вас есть пробелы или скрытый^M, хотя vim хорошо показывает их обычно ... Пространства могут быть захвачены чем-то вроде '[0-9] * [] * $', вы также можете использовать \ вместо просто пробела. –

1

При работе с файлами с разделителями вы можете использовать комплимент разделителя, указав его в классе символов - например, если разделитель ,, комплимент это [^,]

%s/\(,[^,]\+\)\{3\}$// 

Это заменяет 3 группы «запятой, за которым следует один или более символов без запятой», а затем в конце строки. ни с чем.

2

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

Но почему это так сложно?

:%norm $3F,D 
+1

Эта команда классная! но не выполняет работу. он арендует последний символ сзади. Вместо этого используется код, например '% normal $ 3F, D'. – mitnk

+0

@mitnk, спасибо, ответ обновлен. – romainl

1

Также можно использовать сокращение:

:%!cut -d, -f 1-3 
  • срезанных извлекает текст из файла для получения дополнительной помощи см man cut
  • -d, набор запятой в качестве разделителя
  • -f 1-3 вы хотите "вырезать" или экстракционных полей 1-3
  • :%!{cmd} фильтровать весь файл через команду оболочки, {cmd}. См. :h :range!
Смежные вопросы