Есть ли приличная команда Vim regexp ИЛИ? Каков наилучший способ найти несоответствие, если еще? - PullRequest
36 голосов
/ 25 марта 2009

У меня есть некоторые несоответствующие операторы if и fi в скрипте. Я хотел бы вычеркнуть все, кроме "если есть" и "фи". Просто чтобы я мог видеть структуру. Почему я так тяжело работаю с таким мощным редактором? Мне нужен оператор BIGFATOR для регулярных выражений или какое-то прозрение, которое ускользнуло от меня ... Меня не волнует понтификация регулярных выражений, просто что-то практичное, работающее в VIM7.2.

: г / [^ \ t] если [/ print

распечатает ifs

: g / [^ \ t] fi / print

распечатает файл

То, что я хочу сделать, это условия

: г / [^ \ t] фи БИГАТОРОПЕРАТОР [^ \ t] фи / печать

Мне удалось сделать следующее ... но я чувствую, что работаю слишком тяжело!

: вызов TripMatch ('[^ \ t] * if [', 'else', 'fi [\ t $]')

функция! TripMatch (стр1, стр2, стр3)

let var1 = a: str1

let var2 = a: str2

let var3 = a: str3

let max = line ("$")

пусть n = 1

для n в диапазоне (1, макс.)

let currentline = getline (n)

if currentline =~? var1

   echo n "1:" currentline

else

   if currentline =~? var2

      echo n "2:" currentline

   else

      if currentline =~? var3

         echo n "3:" currentline

      else

         let foo = "do nothing"

      endif

   endif

endif     

ENDFOR

EndFunction

Ответы [ 3 ]

69 голосов
/ 25 марта 2009
:g/[ ^\t]if\|[ ^\t]fi/print

БИГАТОРОПЕРАТОР равен \|. Это называется оператор чередования . В PCRE это просто |. Он экранирован в Vim / ex, потому что | используется в других местах для общих команд (или чего-то еще - FIXME).

14 голосов
/ 25 марта 2009

Если вы хотите удалить все остальные строки, кроме тех, которые с if, else или fi, вы можете использовать это

%v/\(if\|else\|fi\)/d   

'v' является противоположностью 'g' и удалит все строки, которые не соответствуют регулярному выражению.

Чтобы добавить к тому, что сказал Стрейджер, символ трубы '|' я избегаю в Vim, я полагаю, потому что Vim предполагает, что вы будете искать буквальные символы чаще, чем вам понадобится обширный RegExps.

Вы можете сделать так, чтобы Vim использовал меньше экранированных RegExps, установив «магический» уровень на «очень» в режиме ex:

Использование "\ v" означает, что в шаблоне после него все символы ASCII, кроме «0» - «9», «a» - «z», «A» - «Z» и «_» имеют особое значение. "очень волшебно"

См .: он / магия для получения дополнительной информации

Не рекомендуется устанавливать магический уровень по умолчанию на «очень» в вашем vimrc, хотя (как отмечает файл справки).

7 голосов
/ 25 марта 2009
:h /\|

Если вы пропустили \ |, вы, вероятно, пропустили множество других шаблонов"токенов".

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