Как экспортировать совпадения только при поиске по шаблону в vim?
-
27-09-2019 - |
Вопрос
Есть ли способ получить и экспортировать часть совпадения только при поиске по шаблону, не изменяя текущий файл?
Например, из файла, содержащего:
57","0","37","","http://www.thisamericanlife.org/Radio_Episode.aspx?episode=175"
58","0","37","","http://www.thisamericanlife.org/Radio_Episode.aspx?episode=170"
Я хочу экспортировать новый файл, содержащий:
http://www.thisamericanlife.org/Radio_Episode.aspx?episode=175
http://www.thisamericanlife.org/Radio_Episode.aspx?episode=170
Я могу сделать это, используя замену следующим образом:
:s/.\{-}\(http:\/\/.\{-}\)".\{-}/\1/g
:%w>>data
Но команда замены меняет текущий файл.Есть ли способ сделать это без изменения текущего файла?
Обновлять:
Я ищу такую команду:
:g/pattern/.w>>newfile
Эта команда записывает всю строку, где встречается совпадение.Я хочу экспортировать только совпадение, а не всю строку.
Решение
Просто измените свой заказ:
:w newfile.txt
:e newfile.txt
:%s/.\{-}\(http:\/\/.\{-}\)".\{-}/\1/g
:w
Другие советы
redir >>newfile
g/^/let g:match=matchstr(getline(line('.')), pattern) | if g:match!=#"" | silent echo g:match | endif
redir END
Объяснение:
redir >> newfile
- Начать перенаправление сообщений в файл
newfile
, добавьте, если он существует. g/^/
- Для каждой строки
getline(line('.'))
- получить содержимое строки
let g:match(getline(line('.')), pattern)
- найди часть строки, которая соответствует
pattern
и сохраните его вg:match
переменная if g:match!=#""
- если линия соответствует шаблону
echo g:match
- выходная соответствующая строка
silent echo g:match
- но только в место, указанное
redir
команда. redir END
- Прекратите перенаправление вывода.
Вы имеете в виду это?
:e currfile.txt
:s/.\{-}\(http:\/\/.\{-}\)".\{-}/\1/g
:w newfile.txt
Или вы хотите продолжить редактирование предыдущего файла?
РЕДАКТИРОВАТЬ: Или вы можете просто отменить действие (нажмите «u»).
Не связан с StackOverflow