пошук рядків, що містять візерунок, але не містять другого


15

Мені потрібно шукати рядки, які містять слово, але не містять другого слова.

Наприклад, знайдіть рядки, які містять слово "Це", але не слово "червоний"

так що для файлу, що містить ці рядки

This is a blue coat
This is a red  coat
This is a purple coat
That is a coat

У результаті пошуку буде розміщено лише перший та третій рядки.

Дякую за будь-яку пораду!


Ви можете використовувати плагін LogiPat, який поширюється з новими Vims
Крістіан Брабандт,

Відповіді:


23

Ви можете використовувати цю команду для друку рядків, що містять, Thisа не red:

:g/\(.*This\)\&\(.*red\)\@!
  • \&відокремлює гілки як логічне, ANDтому що ми хочемо, щоб лінії відповідали двом умовам (гілкам),
  • \(.*This\)це перша галузь, це може бути просто, Thisале вона є загальнішою,
  • \(.*red\)\@!є другою гілкою, \@!означає "відповідність нульовій ширині, якщо попередній атом не відповідає", як логічне NOT.

Іншими словами:

\(.*This\)  \&  \(.*red\)\@!
°°°°°°°°°°  °°  °°°°°°°°°°°°
'This'      AND NOT 'red'

Велике спасибі, це дуже нагадує запит через відформатований текст. Мені вдалося використати це для пошуку функцій, у яких відсутні документи.
Джошуа Детвейлер

1

Погляньте на цю публікацію.

Поєднайте його з відповіддю @romainl, і ви зможете робити все, що завгодно.

Приклад: Скажімо, я хочу додати constфункції до функцій, які їх не мають.

    handleChange = value => {

Сценарій VIM:

%s/\([ ]*\)\(\w* = .*$\)\&^\(\&\(.*const.*\)\@!.\)*$/\1const \2/gc

Вихід:

    const handleChange = value => {

Пояснення:

\([ ]*\)\(\w* = .*$\)

- дістань мені всі рядки, які є word =

\&

- поєднати правила

^\(\&\(.*const.*\)\@!.\)*$

- рядок не повинен містити const.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.