Я задавался вопросом, было ли возможно перечислить исключение в файле, просачивается, "находят в файлах" функциональность Блокнота ++.
Например, следующее заменит Собаку CAT во всех файлах.
Найдите что: Собака
Замена: CAT
Фильтры: *.*
То, что я хотел бы сделать, заменить Собаку CAT во всех файлах кроме тех, которые в .sh файлах.
Действительно ли это возможно?
Думаю, что-то вроде «отрицательного селектора» в Notepad ++ не существует.
Я бегло просмотрел исходный код 5.6.6 , и мне кажется, что механизм выбора файлов сводится к функции с именем getMatchedFilenames ()
, которая рекурсивно проходит через все файлы под определенным каталогом, который, в свою очередь, вызывает следующую функцию, чтобы проверить, соответствует ли имя файла шаблону:
bool Notepad_plus::matchInList(const TCHAR *fileName, const vector<generic_string> & patterns)
{
for (size_t i = 0 ; i < patterns.size() ; i++)
{
if (PathMatchSpec(fileName, patterns[i].c_str()))
return true;
}
return false;
}
Насколько я могу определить, PathMatchSpec не допускает отрицательных селекторов.
Однако можно ввести список положительных фильтров . Если бы вы могли составить этот список достаточно длинным, чтобы включить в него все расширения в вашем каталоге, кроме .sh
, вы тоже там.
Удачи!
Отличный ответ Mitegreen.
К сожалению, что Notepad ++ не может сделать это.
Этот протестированный пример будет делать трюк (Python). Установите
Метод благодаря Thomas Watnedal :
from tempfile import mkstemp
import glob
import os
import shutil
def replace(file, pattern, subst):
""" from Thomas Watnedal's answer to SO question 39086
search-and-replace-a-line-in-a-file-in-python
"""
fh, abs_path = mkstemp() # create temp file
new_file = open(abs_path,'w')
old_file = open(file)
for line in old_file:
new_file.write(line.replace(pattern, subst))
new_file.close() # close temp file
os.close(fh)
old_file.close()
os.remove(file) # remove original file
shutil.move(abs_path, file) # move new file
def main():
DIR = '/path/to/my/dir'
path = os.path.join(DIR, "*")
files = glob.glob(path)
for f in files:
if not f.endswith('.sh'):
replace(f, 'dog', "cat")
if __name__ == '__main__':
main()