6

Notepad++の「ファイル内検索」機能のファイルフィルター内に除外をリストすることが可能かどうか疑問に思いました。

たとえば、次のようにすると、すべてのファイルでDogがCatに置き換えられます。

何を見つける:犬

置換:猫

フィルタ:*。*

私がやりたいのは、.shファイル以外のすべてのファイルでDogをCatに置き換えることです。

これは可能ですか?

4

2 に答える 2

9

「ネガティブセレクター」のようなものは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、あなたもそこにいます。

幸運を!

于 2010-02-02T22:42:32.517 に答える
3

リトルグリーンによる素晴らしい答え
残念ながら、Notepad++ではそれができません。

このテストされた例は、トリック(Python)を実行します。トーマスワトネダルreplaceのおかげでメソッド:

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()
于 2010-02-02T23:54:34.750 に答える