vim regex поиск строки csv и вставка совпадений - PullRequest
2 голосов
/ 05 мая 2009

редактирование:

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


У меня есть CSV-файл, который выглядит примерно так:

Два поля:

  • ID

  • описание


0g98932 , "длинное описание, иногда содержащее такие цифры, как 1234567 или 0000012345 и даже BR00012345, но всегда содержащие текст "

Мне нужно найти поле описания в каждой строке. Если во втором поле существует число, соответствующее \ d {10} , я хочу вытащить его.

делать что-то вроде :% s/(\d{10})/^$1/g дает мне

Ошибка: шаблон не найден (\ d {10}).

Я так и не научился получать и ссылаться на совпадения из поиска по регулярным выражениям в vim - так что это часть проблемы.

Другая часть:

Мне бы очень хотелось.

  1. Удалите все, кроме первых 7 цифр id и совпадений.
  2. Скопируйте id и совпадения в другой файл - или в начало текущего файла (где-нибудь - где угодно, чтобы отделить совпадения от нефильтрованных данных).

Ответы [ 2 ]

6 голосов
/ 06 мая 2009

Важно знать о регулярных выражениях vim, что разные уровни требуется экранирование (в отличие, скажем, от регулярных выражений в Perl или Ruby)

С :help /\m

after:    \v     \m       \M        \V    matches
                 'magic'  'nomagic'
          $      $        $         \$    matches end-of-line
          .      .        \.        \.    matches any character
          *      *        \*        \*    any number of the previous atom
          ()     \(\)     \(\)      \(\)  grouping into an atom
          |      \|       \|        \|    separating alternatives
          \a     \a       \a        \a    alphabetic character
          \\     \\       \\        \\    literal backslash
          \.     \.       .         .     literal dot
          \{     {        {         {     literal '{'
          a      a        a         a     literal 'a'

Значением по умолчанию является «магия», поэтому, чтобы регулярное выражение, которое вы дали, сработало, вам нужно должны использовать:

:%s/".*\(\d\{10}\).*"/\1/

Если вы хотите удалить все, кроме первого 7-значного идентификатора и совпадений (я предполагаю, что вы имеете в виду, что хотите удалить строки без какого-либо соответствия)

:v/^\([[:alnum:]]\{7}\),\s*".*\(\d\{10}\).*/d
:%s//\1,\2/

Команда :v/<pattern>/ позволяет запускать команду в каждой строке, которая не соответствует данный шаблон, так что это просто удаляет несоответствия. :s// повторно использует предыдущий шаблон, поэтому нам не нужно указывать это.

Это преобразует следующее:

0g98932,"long description sometimes containing numbers like 0123456789"
0g98932,"long description no numbers"
0g98932,"long description no numbers"
0g98932,"long description sometimes containing numbers like 0123456789"
0g98932,"long description no numbers"
0g98932,"long description no numbers"
0g98932,"long description no numbers"
0g98932,"long description no numbers"
0g98932,"long description sometimes containing numbers like 0123456789"
0g98932,"long description no numbers"
0g98932,"long description no numbers"
0g98932,"long description sometimes containing numbers like 0123456789"

в это:

0g98932,0123456789
0g98932,0123456789
0g98932,0123456789
0g98932,0123456789
3 голосов
/ 05 мая 2009

Чтобы получить совпадение, вы должны использовать

\(pattern\)

Для удаления используйте

:%s/not_pattern\(pattern\)another_not_pattern/\1/
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...