Массовый цикл переименования содержимого файла из списка в массив

#javascript #node.js #regex #replace

#javascript #node.js #регулярное выражение #заменить

Вопрос:

У меня есть небольшой скрипт, который я тестирую, но, похоже, не могу заставить вывод работать правильно.

У меня есть множество файлов markdown с URL-адресами в них и массив, который создается из мертвых URL-адресов (это внутренние ссылки, а не общедоступные).

 const urls = [
 'http://internal.site1.com',
 'https://internal.site2.com',
 'http://internal.site3.com/file.html',
 'https://internal.site4.com/dir/'
];

const markdown = [
 './file1.md',
 './file2.md',
 './sub/file3.md',
 './sub/sub/file4.md',
];
 

И я зацикливаю файлы markdown из массива, а затем пытаюсь заменить url из возвращенных данных:

 for( const md of markdown ) {
  var mdFileContents = fs.readFileSync( md, 'utf8' );
  for( const url of urls ) {
    var result = mdFileContents.replaceAll( url, '[X]' );
    // also tried: var result = mdFileContents.replace( new RegExp( url, "g" ), "[X]" );
  }
}
 

За исключением случаев, когда это выполняется, и я делаю console.log(result); , я либо не получаю замен, либо получаю только один URL (для одного файла) из всех замененных файлов.

Мои тестовые файлы markdown в духе:

 HTTP URL:  http://internal.site1.com
HTTPS URL: https://internal.site2.com

[md shortcode](http://internal.site3.com/file.html)
[mb shortcode](https://internal.site4.com/dir/)
 

С одним тестовым md файлом без совпадающих URL-адресов. Результаты скрипта отображаются в виде:

 HTTP URL:  [X]
HTTPS URL: https://internal.site2.com

[md shortcode](http://internal.site3.com/file.html)
[mb shortcode](https://internal.site4.com/dir/)
 

Я что-то делаю неправильно или в неправильном порядке?

Ответ №1:

Сначала вы запускаете цикл для файлов. Затем для каждого файла зациклите URL-адреса и запустите:

 var result = mdFileContents.replaceAll( url, '[X]' );
 

Таким образом, для каждого URL-адреса вы перечитываете содержимое файла (которое по-прежнему остается неизмененным) и заменяете соответствующий URL-адрес на [X]

Теперь при запуске console.log(result); вы увидите только одну замену, поскольку вы каждый раз перечитываете содержимое файла.

Вы можете прочитать содержимое каждого файла в for exampele mdFileContents , а затем выполнить замены для всех URL-адресов, повторно mdFileContents используемых до тех пор, пока все замены не будут выполнены.

Обратите внимание, что ваши URL-адреса содержат точку. Когда вы передаете строку в конструктор регулярных выражений, вам нужно дважды экранировать точку \. , чтобы она соответствовала буквально, иначе точка будет соответствовать любому символу, кроме новой строки.

 let mdFileContents = fs.readFileSync( md, 'utf8' );

for( const url of urls ) {
    mdFileContents = mdFileContents.replace( new RegExp( url, "g" ), "[X]" );
}
console.log(mdFileContents);
 

Комментарии:

1. это имеет смысл — не могу поверить, что я этого не видел!

2. @markb Не беспокойтесь, это случается 🙂 Удачи!