Я использую задачу md5 grunt для генерации имен файлов MD5. Теперь я хочу переименовать источники в файле HTML с новым именем файла в обратном вызове задачи. Интересно, какой самый простой способ сделать это?
javascript
node.js
replace
gruntjs
Андреас Кёберле
источник
источник
Ответы:
Вы можете использовать простое регулярное выражение:
Так...
источник
Поскольку замена не работала для меня, я создал простую замену пакета в файле npm, чтобы быстро заменить текст в одном или нескольких файлах. Это частично основано на ответе @ asgoth.
Изменить (3 октября 2016 г.) : теперь пакет поддерживает обещания и глобусы, и инструкции по использованию были обновлены с учетом этого.
Редактирование (16 марта 2018 г.) . Пакет в настоящее время содержит более 100 тыс. Ежемесячных загрузок и был расширен за счет дополнительных функций, а также инструмента CLI.
Установка:
Требуется модуль
Укажите варианты замены
Асинхронная замена с обещаниями:
Асинхронная замена с обратным вызовом:
Синхронная замена:
источник
Возможно, модуль «замена» ( www.npmjs.org/package/replace ) также подойдет вам. Это не потребует, чтобы вы прочитали и затем записали файл.
Адаптировано из документации:
источник
readFile()
и такwriteFile()
же, как принятый ответ.Вы также можете использовать функцию sed, которая является частью ShellJS ...
Посетите ShellJs.org для большего количества примеров.
источник
shx
позволяет вам запускать из сценариев npm, ShellJs.org рекомендовал это. github.com/shelljs/shxВы можете обработать файл во время чтения, используя потоки. Это похоже на использование буферов, но с более удобным API.
источник
bufferSize
можно ли избежать этой проблемы, установив длину, превышающую строку, которую вы заменяете, и сохранив последний блок и конкатенировав его с текущим.Я столкнулся с проблемами при замене небольшого заполнителя большой строкой кода.
Я делал:
Я понял, что проблема заключается в специальных шаблонах замены JavaScript, описанных здесь . Поскольку код, который я использовал в качестве замещающей строки, содержал в себе некоторое количество
$
, это приводило к неправильному выводу.Мое решение состояло в том, чтобы использовать функцию замены функции, которая НЕ делает никакой специальной замены:
источник
ES2017 / 8 для узла 7.6+ с временным файлом записи для атомарной замены.
Обратите внимание, только для небольших файлов, так как они будут прочитаны в память.
источник
bluebird
, используйте роднойPromise
и util.promisify .На Linux или Mac хранить просто и использовать sed вместе с оболочкой. Внешние библиотеки не требуются. Следующий код работает на Linux.
Синтаксис sed немного отличается на Mac. Я не могу проверить это прямо сейчас, но я считаю, что вам просто нужно добавить пустую строку после "-i":
"Г" после финала "!" заставляет sed заменить все экземпляры в строке. Удалите его, и будет заменено только первое вхождение в строке.
источник
Если продолжить ответ @ Sanbor, то наиболее эффективный способ сделать это - прочитать исходный файл в виде потока, а затем также направить каждый чанк в новый файл и, наконец, заменить исходный файл новым файлом.
источник
Я бы использовал дуплексный поток вместо этого. как документировано здесь nodejs doc дуплексные потоки
источник
<p>Please click in the following {{link}} to verify the account</p>
наверняка вы можете улучшить функцию чтения шаблона для чтения в виде потока и составлять байты построчно, чтобы сделать его более эффективным
источник