Что логично И в Sed / Vim? - PullRequest
1 голос
/ 13 июля 2009

Я хотел бы получить оператор И для следующей команды Vim

:command! -nargs=1 GrepSource :! grep <args> `sed -n 's/^source \(.*\)/\1/p' %`

такой, что я могу использовать команду для поиска источников на

# source <path>
# . <path> 
source <path>
. <path>

Я не уверен, возможно ли получить оператор AND для SED или Vim.

Как добавить оператор AND к команде SED?

Ответы [ 2 ]

2 голосов
/ 13 июля 2009

Мне не ясно, чего вы пытаетесь достичь / ищете. Возможно, если вы укажете, что именно вы пытаетесь сделать и что должен делать AND, мы могли бы помочь больше.

Это решение выполняется из команды vim:

grep PATTERN /some/path/*

Если вы ищете файлы в каталоге, вы бы использовали:

ls /some/path | grep PATTERN

Вы можете обновить соответствующие части команды.

В любом случае ...

Из вашего скрипта я предполагаю, что у вас есть строка, указывающая путь к каталогу, который вы хотите найти для чего-то, например, Вы хотите найти путь для PATTERN, поместите курсор на строку с путем, затем вы хотите извлечь путь и выполнить поиск по шаблону с помощью вашей команды, пример строки в файле:

source /some/path

Эта команда должна делать то, что вы ожидаете:

:command! -nargs=1 GrepSource :exe printf("!grep '<args>' '%s'/*", substitute(
getline('.'), "\\%(source\\s*\\)\\(.*\\)$", "\\1",""))

С помощью курсора на строке с путем, начинающимся с источника слова, вы можете выполнить указанную выше команду:

:GrepSource PATTERN

Это будет искать файлы в '/ some / path /' по слову PATTERN.

Я предполагаю, что пути в вашем файле не заканчиваются косой чертой '/', и я предполагаю, что вы хотите искать в файлах, поэтому я добавляю '/ *' в конце пути к поиску, заканчивающемуся командой:

grep PATTER /some/path/*

Я использовал substitute команду, которая заменяет

source /some/path

с

/some/path

Который затем используется в printf для создания фактической команды.

1 голос
/ 13 июля 2009

Вы можете просто использовать регулярные выражения Vim, чтобы найти имя <path> вместо использования sed:

:command! -nargs=1 GrepSource :exe printf("!grep '<args>' '%s'", matchstr(getline('.'), '^#\=\s*\%(source\|\.\)\s*\zs\f\+'))

Я думаю, что команда должна делать то, что вы хотите. Вы можете использовать следующую команду, чтобы проверить, что происходит (exe изменен на echo):

:command! -nargs=1 GrepSourceTest :echo printf("!grep '<args>' '%s'", matchstr(getline('.'), '^#\=\s*\%(source\|\.\)\s*\zs\f\+'))

Команда должна использоваться в строке в одной из следующих форм:

# source <somefile>
# . <somefile>
source <somefile>
. <somefile>
...