Używam md5 grunt task do generowania nazw plików MD5. Teraz chcę zmienić nazwy źródeł w pliku html z nową nazwą pliku w wywołaniu zwrotnym zadania. Zastanawiam się, jaki jest najłatwiejszy sposób na zrobienie tego.Zamień ciąg znaków w pliku na nodejs
Odpowiedz
Można użyć prostego wyrażenia regularnego:
var result = fileAsString.replace(/string to be replaced/g, 'replacement');
więc ...
var fs = require('fs')
fs.readFile(someFile, 'utf8', function (err,data) {
if (err) {
return console.log(err);
}
var result = data.replace(/string to be replaced/g, 'replacement');
fs.writeFile(someFile, result, 'utf8', function (err) {
if (err) return console.log(err);
});
});
Można również użyć funkcji 'sed', który jest częścią ShellJS ...
$ npm install [-g] shelljs
require('shelljs/global');
sed('-i', 'search_pattern', 'replace_pattern', file);
Odwiedź stronę ShellJs.org, aby uzyskać więcej przykładów.
Być może moduł "zamień" (www.npmjs.org/package/replace) również będzie działał dla Ciebie. Nie wymagałoby to odczytywania, a następnie zapisywania pliku.
Adaptacja dokumentacji:
// install:
npm install replace
// require:
var replace = require("replace");
// use:
replace({
regex: "string to be replaced",
replacement: "replacement string",
paths: ['path/to/your/file'],
recursive: true,
silent: true,
});
Czy wiesz, jak filtrować według rozszerzenia pliku w ścieżkach? coś w rodzaju ścieżek: ['ścieżka/do/twój/plik/*. js'] -> to nie działa – Kalamarico
Możesz użyć węzła-glob, aby rozwinąć wzorce globu do tablicy ścieżek, a następnie iterować nad nimi. – RobW
To jest ładne, ale zostało porzucone. Zobacz http://stackoverflow.com/a/31040890/1825390 dla pakietu konserwacyjnego, jeśli chcesz mieć gotowe rozwiązanie. – xavdid
Od zastąpić nie działa dla mnie, stworzyliśmy prosty pakiet npm replace-in-file szybko zamienić tekst w jednej lub kilku plików. Częściowo opiera się na odpowiedzi @ asgotha.
Edytuj (3 października 2016 r.): Pakiet obsługuje teraz obietnice i globsy, a instrukcje użytkowania zostały zaktualizowane, aby to odzwierciedlić.
Instalacja:
npm install replace-in-file
Wymaga modułu
const replace = require('replace-in-file');
Określ opcje zamienne
const options = {
//Single file
files: 'path/to/file',
//Multiple files
files: [
'path/to/file',
'path/to/other/file',
],
//Glob(s)
files: [
'path/to/files/*.html',
'another/**/*.path',
],
//Replacement to make (string or regex)
from: /Find me/g,
to: 'Replacement',
};
wymiana asynchroniczny z obietnic:
replace(options)
.then(changedFiles => {
console.log('Modified files:', changedFiles.join(', '));
})
.catch(error => {
console.error('Error occurred:', error);
});
wymiana asynchroniczny z zwrotnego:
replace(options, (error, changedFiles) => {
if (error) {
return console.error('Error occurred:', error);
}
console.log('Modified files:', changedFiles.join(', '));
});
synchroniczna wymiana:
try {
let changedFiles = replace.sync(options);
console.log('Modified files:', changedFiles.join(', '));
}
catch (error) {
console.error('Error occurred:', error);
}
Można przetworzyć pliku podczas odczytywania za pomocą strumieni. To tak, jak przy użyciu buforów, ale z wygodniejszym interfejsem API.
var fs = require('fs');
function searchReplaceFile(regexpFind, replace, cssFileName) {
var file = fs.createReadStream(cssFileName, 'utf8');
var newCss = '';
file.on('data', function (chunk) {
newCss += chunk.toString().replace(regexpFind, replace);
});
file.on('end', function() {
fs.writeFile(cssFileName, newCss, function(err) {
if (err) {
return console.log(err);
} else {
console.log('Updated!');
}
});
});
searchReplaceFile(/foo/g, 'bar', 'file.txt');
Ale ... co jeśli fragment dzieli ciąg regexpFind? Czy zatem nie ma zamiaru? –
To bardzo dobry punkt. Zastanawiam się, czy ustawiając 'bufferSize' dłuższą niż ciąg, który zastępujesz i zapisując ostatni fragment i łącząc się z bieżącym, możesz uniknąć tego problemu. – sanbor
Prawdopodobnie ten fragment kodu powinien zostać poprawiony poprzez zapisanie zmodyfikowanego pliku bezpośrednio do systemu plików, zamiast tworzenia dużej zmiennej, ponieważ plik może być większy niż dostępna pamięć. – sanbor
użyłbym strumień dwustronnego zamiast. jak udokumentowane nodejs doc duplex streams
transformacji strumień jest strumieniem dupleksu w którym wyjście jest obliczana w jakiś sposób z wejścia.
Wystąpił problem przy wymianie małego symbolu zastępczego z dużym ciągiem kodu.
robiłem:
var replaced = original.replace('PLACEHOLDER', largeStringVar);
zorientowali się problemem było specjalne wzory zamienne Javascript w opisany here. Ponieważ kod, który użyłem jako zastępujący ciąg znaków, miał w sobie pewną liczbę $
, zepsuł wynik.
Moje rozwiązanie było użyć opcji zastępczej funkcja, która nie robi żadnej specjalnej Zamiennik:
var replaced = original.replace('PLACEHOLDER', function() {
return largeStringVar;
});
ES2017/8 dla węzła 7.6+ z pliku tymczasowego zapisu dla wymiany atomowej.
const Promise = require('bluebird')
const fs = Promise.promisifyAll(require('fs'))
async function replaceRegexInFile(file, search, replace){
let contents = await fs.readFileAsync(file, 'utf8')
let replaced_contents = contents.replace(search, replace)
let tmpfile = `${file}.jstmpreplace`
await fs.writeFileAsync(tmpfile, replaced_contents, 'utf8')
await fs.renameAsync(tmpfile, file)
return true
}
Uwaga, tylko dla małych plików, ponieważ będą one odczytywane do pamięci.
Nie trzeba używać "bluebird", używać natywnych 'Promise' i [util.promisify] (https://nodejs.org/dist/latest-v8.x/docs/api/util.html#util_util_promisify_original). –
@FranciscoMateo Prawda, ale poza 1 lub 2 funkcjami promisifyWszystko jest nadal bardzo przydatne. – Matt
- 1. Zamień ciąg znaków w pliku
- 2. znajdź i zamień ciąg znaków w pliku
- 3. php - Zamień ciąg znaków wystąpień
- 4. Wyszukaj i zamień ciąg znaków w bardzo dużym pliku.
- 5. Zamień "\\" na "\" w ciągu znaków w C#
- 6. sed - zamień ciąg znaków na równą liczbę znaków
- 7. Zamień ciąg znaków znakiem nowej linii PHPStorm
- 8. Konwertowanie zawartości pliku HtmlTextWriter na ciąg znaków
- 9. Konwersja pliku HtmlDocument.DomDocument na ciąg znaków
- 10. Konwersja pliku XML na ciąg znaków
- 11. Znajdź i zamień ciągi znaków w vim na wielu liniach
- 12. Zamień wiele znaków w ciągu znaków (XSLT)
- 13. Znajdź i zamień ciąg znaków HTML za pomocą jQuery
- 14. Zamień dwie litery w ciągu znaków
- 15. Zamień ciąg w ramce danych
- 16. Zamień ciąg w pliku tekstowym przy użyciu PowerShell
- 17. Zamień na ostatnią literę ciągu znaków
- 18. Zamień tablicę ruby na czysty ciąg kolumn?
- 19. Zamień "na \" w Ruby?
- 20. Databinding RichTextBox.Text na ciąg znaków
- 21. Przekieruj stdout na ciąg znaków w Javie
- 22. Konwertuj ciąg znaków na kod w schemacie
- 23. Konwertowanie znaków Unicode na ciąg znaków
- 24. R, podzielony ciąg znaków na pary znaków
- 25. Konwertuj ciąg znaków RTF na ciąg XAML
- 26. ciąg :: kasowanie (0) na pusty ciąg znaków?
- 27. Przekształć tablicę znaków na ciąg znaków
- 28. Zamień \ usuń znak w ciągu znaków
- 29. Zamień wiele znaków w ciągu znaków w Objective-C?
- 30. Zamień ostatnie słowo w ciągu znaków
Oczywiście, ale czy muszę przeczytać plik, zastąpić tekst, a następnie napisać plik ponownie, czy jest łatwiejszy sposób, przepraszam, że jestem bardziej facetem z frontendu. –
Być może istnieje moduł węzła, aby to osiągnąć, ale nie jestem tego świadomy. Dodano pełny przykład btw. – asgoth
mały błąd, zamień na linię 6 'someFile' z 'danymi' – Zax