如何监视文件并执行查找替换但不将该查找替换捕获为监视文件中的事件

How to watch file(s) and perform find-replace but not capture that find-replace as an event in watched file

我真的不明白为什么在将 say 'fizbuzz' 写入文件 test.txt 时当前会输出两行——我知道它正在查找和替换,但有没有办法找到并替换以使其不会被监视功能捕获?

const watch = require('node-watch');
const replacer = require('replace-in-file');

const files_to_watch = [
                        '/users/gigatexal/code/nodejs/test.txt',
                        '/users/gigatexal/code/nodejs/test2.txt',
                        '/users/gigatexal/code/nodejs/test3.txt'
                     ] 

设置完成,进入问题

files_to_watch.forEach(f =>
    {
        watch(f, 
            {resursive: false}, 
                function(evt, name){
                    replacer(
                        {
                         files: f, 
                         from: 'fizbuzz', 
                         to: 'foobar'
                        })
                         .then(change=>{console.log('the file ',f,' was fixed.')})
                         .catch(error=>(console.log('oops caught an error', error)));        
                }
            )
    }
);

与上面运行:

echo "fizbuzz" >> /users/gigatexal/code/nodejs/test2.txt

输出:

the file  /users/gigatexal/code/nodejs/test.txt  was fixed.
the file  /users/gigatexal/code/nodejs/test.txt  was fixed.

免责声明:我充其量只是一个 intermediate/beginner python 开发人员,所以这不是惯用的 NodeJS 代码,现在还不是。我想了解如何到达那里。

由于您没有提供太多关于您的 OS 和程序包版本号的信息,而且我没有足够的声誉来发表评论。我会尝试提供一些建议,但不太确定它们是否有帮助。

  1. 确保使用最新版本的 node-watch,v0.5.5。

  2. 创建一个新函数(比如 handle_file)来处理单个文件,以便于调试。

    function handle_file(f) {
      watch(f, function(evt, name) {
        replacer({
          files: f,
          from: 'fizbuzz',
          to: 'foobar'
        })
       .then(change => {
          console.log('the file %s was fixed.', f)
        })
       .catch(error => {
          console.log('oops caught an error', error)
        });
      })
    }
    
    // now only need to do this
    files_to_watch.forEach(handle_file)
    
  3. 用一些日志替换replacer函数,看看是否检测到变化,是否有双重变化:

    function handle_file(f) {
      watch(f, function(evt, name) {
        console.log('%s changes.', name);
      })
    }
    
  4. 然后说不定你就知道问题出在哪里了