Używam zadania md5 grunt do generowania nazw plików MD5. Teraz chcę zmienić nazwy źródeł w pliku HTML na nową nazwę pliku w wywołaniu zwrotnym zadania. Zastanawiam się, jak to zrobić najłatwiej.
javascript
node.js
replace
gruntjs
Andreas Köberle
źródło
źródło
Odpowiedzi:
Możesz użyć prostego wyrażenia regularnego:
Więc...
źródło
Ponieważ funkcja zastępowania nie działała, utworzyłem prosty pakiet npm do zamiany w pliku, aby szybko zastąpić tekst w jednym lub wielu plikach. Jest częściowo oparty na odpowiedzi @ asgoth.
Edycja (3 października 2016 r.) : Pakiet obsługuje teraz obietnice i elementy globalne, a instrukcje użytkowania zostały zaktualizowane, aby to odzwierciedlić.
Edycja (16 marca 2018 r.) : Pakiet zgromadził teraz ponad 100 tys. Miesięcznych pobrań i został rozszerzony o dodatkowe funkcje, a także narzędzie CLI.
Zainstalować:
Wymagaj modułu
Określ opcje wymiany
Asynchroniczna wymiana z obietnicami:
Asynchroniczna zamiana z wywołaniem zwrotnym:
Synchroniczna wymiana:
źródło
Być może moduł „replace” ( www.npmjs.org/package/replace ) również zadziała. Nie wymagałoby to czytania, a następnie zapisywania pliku.
Na podstawie dokumentacji:
źródło
readFile()
iwriteFile()
tak jak zaakceptowana odpowiedź.Możesz także użyć funkcji 'sed', która jest częścią ShellJS ...
Wizyta ShellJs.org więcej przykładów.
źródło
shx
pozwala na uruchamianie ze skryptów npm, zaleca ShellJs.org. github.com/shelljs/shxMożesz przetwarzać plik podczas odczytu za pomocą strumieni. To tak, jak używanie buforów, ale z wygodniejszym API.
źródło
bufferSize
dłuższy niż ciąg, który zastępujesz, zapisując ostatni fragment i łącząc z bieżącym, możesz uniknąć tego problemu.Napotkałem problemy podczas zastępowania małego symbolu zastępczego dużym ciągiem kodu.
Ja robiłem:
Odkryłem, że problem dotyczy specjalnych wzorców zastępowania JavaScript, opisanych tutaj . Ponieważ kod, którego użyłem jako zastępujący ciąg, zawierał trochę
$
w sobie, zakłócał wynik.Moim rozwiązaniem było użycie opcji zamiany funkcji, która NIE WYKONUJE żadnej specjalnej zamiany:
źródło
ES2017 / 8 dla węzła 7.6+ z tymczasowym plikiem zapisu do zastąpienia atomowego.
Uwaga, tylko dla małych plików, ponieważ zostaną one odczytane do pamięci.
źródło
bluebird
, użyj natywnegoPromise
i util.promisify .W systemie Linux lub Mac Keep jest prosty i po prostu używaj seda z powłoką. Nie są wymagane żadne biblioteki zewnętrzne. Poniższy kod działa w systemie Linux.
Składnia seda jest trochę inna na Macu. Nie mogę tego teraz przetestować, ale wydaje mi się, że wystarczy dodać pusty ciąg po „-i”:
Litera „g” po ostatnim „!” sprawia, że sed zastępuje wszystkie instancje w linii. Usuń go, a tylko pierwsze wystąpienie w wierszu zostanie zastąpione.
źródło
Rozwijając odpowiedź @ Sanbor, najskuteczniejszym sposobem na to jest odczytanie oryginalnego pliku jako strumienia, a następnie strumieniowanie każdej porcji do nowego pliku, a następnie zastąpienie oryginalnego pliku nowym plikiem.
źródło
Zamiast tego użyłbym strumienia dupleksowego. jak udokumentowano tutaj nodejs doc dupleksowe strumienie
źródło
<p>Please click in the following {{link}} to verify the account</p>
z pewnością możesz ulepszyć funkcję szablonu odczytu, aby czytać jako strumień i komponować bajty po linii, aby była bardziej wydajna
źródło