Piszę skrypt pliku wsadowego w środowisku wiersza polecenia systemu Windows i chcę zmienić każde wystąpienie jakiegoś tekstu w pliku (np. „FOO”) na inny (np. „BAR”). Jaki jest najprostszy sposób to zrobić? Jakieś wbudowane funkcje?
492
echo(%text:%search%=%replace%%)
Odpowiedzi:
Wiele odpowiedzi tutaj pomogło mi skierować się we właściwym kierunku, jednak żadna z nich nie była dla mnie odpowiednia, więc zamieszczam swoje rozwiązanie.
Mam system Windows 7 z wbudowanym programem PowerShell. Oto skrypt, którego użyłem do znalezienia / zastąpienia wszystkich wystąpień tekstu w pliku:
Aby to wyjaśnić:
powershell
uruchamia powershell.exe, który jest zawarty w systemie Windows 7-Command "... "
to argument wiersza polecenia dla powershell.exe zawierający polecenie do uruchomienia(gc myFile.txt)
czyta treśćmyFile.txt
(gc
jest skrótem odGet-Content
polecenia)-replace 'foo', 'bar'
po prostu uruchamia polecenie wymiany do wymianyfoo
zbar
| Out-File myFile.txt
przesyła dane wyjściowe do plikumyFile.txt
-encoding ASCII
zapobiega transkrybowaniu pliku wyjściowego do Unicode, jak wskazują komentarzeProgram Powershell.exe powinien już być częścią instrukcji PATH, ale jeśli nie, możesz go dodać. Jego lokalizacja na moim komputerze to
C:\WINDOWS\system32\WindowsPowerShell\v1.0
źródło
-encoding ASCII
lubUTF8
czy cokolwiek jest potrzebne. Uważaj również, jeśli celujesz w UTF8, może wprowadzić znak kolejności bajtów na początku pliku, który nie pojawił się w oryginale.-encoding ASCII
. Dla każdego, kto będzie tego potrzebował w przyszłości, będzie toOut-File -encoding ASCII myFile.txt
Set-Content
zamiastOut-File
.Jeśli korzystasz z wersji Windows, która obsługuje .Net 2.0, zastąpiłbym twoją powłokę. PowerShell daje pełną moc .Net z wiersza poleceń. Istnieje również wiele wbudowanych komend. Poniższy przykład rozwiąże twoje pytanie. Używam pełnych nazw poleceń, są krótsze aliasy, ale daje to coś dla Google.
źródło
powershell -Command "(gc myFile.txt) -replace 'foo', 'bar' | sc myFile.txt"
Wystarczy stosować Fart ( „ F ind nd R EUmieãæ T ext” narzędzie wiersza poleceń): doskonały mały darmowy do zastąpienia tekstu w dużym zestawie plików.
Pliki instalacyjne znajdują się w SourceForge .
Przykład użycia:
wyświetli podgląd zamiany, aby zrobić rekurencyjnie w plikach tej dystrybucji Perla.
Jedyny problem: ikona strony FART nie jest dokładnie gustowna, wyrafinowana ani elegancka;)
Aktualizacja 2017 (7 lat później) jagb Zwraca uwagę w komentarzach do artykułu 2011 „ Farting łatwy sposób - znaleźć i zamienić tekst ” z Mikail Tunç
źródło
/
i'
ponieważ to nie działa dla nas wszystkich , dla mnie działało w niektórych przypadki, ale nie działało na niektórych plikach i nie wiem dlaczego ... Użyłem tego, aby zamienić tekst na inny tekst i/
Zastąp - zamień podłańcuch za pomocą podstawienia łańcucha Opis: Aby zastąpić podłańcuch innym łańcuchem, użyj funkcji podstawiania łańcucha. Pokazany tutaj przykład zastępuje wszystkie wystąpienia błędów pisowni „teh” na „the” w zmiennej str str.
Wyjście skryptu:
ref: http://www.dostips.com/DtTipsStringManipulation.php#Snippets.Replace
źródło
Utwórz plik replace.vbs:
Aby użyć tego poprawionego skryptu (który nazwiemy replace.vbs), po prostu wpisz polecenie podobne do tego w wierszu polecenia:
cscript replace.vbs "C:\Scripts\Text.txt" "Jim " "James "
źródło
RegExp
. Można to wykorzystać, aby zastąpić za pomocą wyrażenia regularnego:With (New RegExp): strNewText = .Replace(strText, strOldText, strNewText): End With
. Można uzyskać tekst z pierwszych 9 grupach przechwytywania użyciu$1
,$2
...$9
.BatchSubstitute.bat
na dostips.com jest przykładem wyszukiwania i zamiany przy użyciu czystego pliku wsadowego.Wykorzystuje połączenie
FOR
,FIND
iCALL SET
.Linie zawierające znaki
"&<>]|^
mogą być traktowane niepoprawnie.źródło
Uwaga - na końcu tej odpowiedzi należy zobaczyć aktualizację łącza do doskonałej wersji JREPL.BAT, która zastępuje REPL.BAT JREPL.BAT 7.0 i nowsze
wersje natywnie obsługujące Unicode (UTF-16LE) za pośrednictwem
/UTF
opcji, a także dowolne inny zestaw znaków, w tym UTF-8, za pośrednictwem ADO !!!!Napisałem małe hybrydowe narzędzie JScript / batch o nazwie REPL.BAT które jest bardzo wygodne do modyfikowania plików ASCII (lub rozszerzonych ASCII) za pomocą wiersza poleceń lub pliku wsadowego. Czysto macierzysty skrypt nie wymaga instalacji żadnych plików wykonywalnych innych firm i działa na dowolnej nowoczesnej wersji systemu Windows od XP. Jest również bardzo szybki, szczególnie w porównaniu z czystymi partiami.
REPL.BAT po prostu odczytuje stdin, wykonuje wyszukiwanie wyrażeń regularnych JScript i zamienia je, i zapisuje wynik na stdout.
Oto trywialny przykład, jak zamienić foo na pasek w test.txt, zakładając, że REPL.BAT znajduje się w twoim bieżącym folderze lub jeszcze lepiej, gdzieś w Twojej ŚCIEŻCE:
Możliwości wyrażenia regularnego JScript sprawiają, że jest on bardzo wydajny, zwłaszcza zdolność tekstu zastępczego do odniesienia do przechwyconych podciągów z tekstu wyszukiwania.
Do narzędzia dołączyłem wiele opcji, które sprawiają, że jest on dość wydajny. Na przykład połączenie opcji
M
iX
umożliwia modyfikację plików binarnych! OpcjaM
Wiele linii umożliwia wyszukiwanie w wielu liniach. OpcjaX
rozszerzonego wzoru podstawienia zapewnia sekwencje specjalne, które umożliwiają włączenie dowolnej wartości binarnej do tekstu zastępczego.Całe narzędzie mogło zostać napisane jako czysty JScript, ale hybrydowy plik wsadowy eliminuje potrzebę jawnego określania CSCRIPT za każdym razem, gdy chcesz używać tego narzędzia.
Oto skrypt REPL.BAT. Pełna dokumentacja jest osadzona w skrypcie.
WAŻNA AKTUALIZACJA
Przestałem opracowywać REPL.BAT i zastąpiłem JREPL.BAT. To nowsze narzędzie ma tę samą funkcjonalność REPL.BAT, a także znacznie więcej:
Jak zawsze pełna dokumentacja jest osadzona w skrypcie.
Oryginalne trywialne rozwiązanie jest teraz jeszcze prostsze:
Aktualna wersja JREPL.BAT jest dostępna na DosTips . Przeczytaj wszystkie kolejne posty w wątku, aby zobaczyć przykłady użycia i historię rozwoju.
źródło
\q
reprezentacji"
, a literały wyszukiwania obsługują teraz wszystkie rozszerzone sekwencje specjalne, gdy opcje L i X są połączone.Użyj FNR
Użyj
fnr
narzędzia. Ma kilka zalet w stosunku dofart
:Pobierz FNR tutaj: http://findandreplace.io/?z=codeplex
Przykład użycia:
fnr --cl --dir "<Directory Path>" --fileMask "hibernate.*" --useRegEx --find "find_str_expression" --replace "replace_string"
źródło
Nie sądzę, żeby można to zrobić za pomocą wbudowanych poleceń. Sugeruję pobranie czegoś takiego jak Gnuwin32 lub UnxUtils i użycie
sed
polecenia (lub tylko pobraniesed
):źródło
sed -i -b -e 's/FOO/BAR/g' `find . -name *.txt`
-i - edytuj plik w miejscu; -b - nie przetwarzaj CR + LF - bez tej opcji CR + LF zostałby przekonwertowany na LFWiem, że jestem spóźniony na przyjęcie ...
Osobiście podoba mi się rozwiązanie na: - http://www.dostips.com/DtTipsStringManipulation.php#Snippets.Replace
My również szeroko wykorzystujemy funkcję Dedupe, aby pomóc nam dostarczać codziennie około 500 e-maili przez SMTP z: - https://groups.google.com/forum/#!topic/alt.msdos.batch.nt/sj8IUhMOq6o
i oba działają natywnie bez dodatkowych narzędzi i narzędzi.
WYMIENNIK:
DEDUPLICATOR (zwróć uwagę na użycie -9 dla numeru ABA):
Dzięki!
źródło
Kiedy pracujesz z Git na Windows, po prostu odpal
git-bash
i używajsed
. Lub, korzystając z systemu Windows 10, uruchom „Bash na Ubuntu w systemie Windows” (z podsystemu Linux) i użyjsed
.Jest to edytor strumieniowy, ale może edytować pliki bezpośrednio za pomocą następującego polecenia:
-i
Opcja służy do edycji w miejscu nazwy pliku.-e
opcja wskazuje polecenie do uruchomienia.s
służy do zamiany znalezionego wyrażenia „foo” na „słupek” ig
do zastąpienia wszystkich znalezionych dopasowań.Uwaga od ereOn:
Jeśli chcesz zamienić ciąg znaków tylko w wersjonowanych plikach repozytorium Git, możesz użyć:
git ls-files <eventual subfolders & filters> | xargs sed -i -e 's/foo/bar/g'
co czyni cuda.
źródło
git ls-files <eventual subfolders & filters> | xargs sed -i -e 's/foo/bar/g'
co działa cuda.Bawiłem się niektórymi z istniejących odpowiedzi tutaj i wolę moje ulepszone rozwiązanie ...
lub jeśli chcesz ponownie zapisać wynik w pliku ...
Zaletą tego jest to, że możesz przesyłać dane wyjściowe z dowolnego programu. Zajmie się także używaniem wyrażeń regularnych. Nie udało się ustalić, jak przekształcić go w plik BAT, aby był łatwiejszy w użyciu ... :-(
źródło
type
oznacza , że wszystkie linie większe niż 80 znaków są zawijane. Co za ból.Użyłem perla i to działa cudownie.
.orig to rozszerzenie, które dołącza do oryginalnego pliku
Dla wielu pasujących plików, takich jak * .html
źródło
sed
zeperl -pi.backup -e
i to doceniam :)Z replaceer.bat
1) Z
e?
opcją, która będzie oceniać sekwencje znaków specjalnych, takie jak\n\r
sekwencje Unicode. W takim przypadku zastąpi cytowany"Foo"
i"Bar"
:2) Prosta zamiana tam, gdzie
Foo
iBar
nie są cytowane.źródło
Oto rozwiązanie, które znalazłem, działało na Win XP. W moim bieżącym pliku wsadowym umieściłem następujące elementy:
replace.bat
Pliku jest jak poniżej. Nie znalazłem sposobu na włączenie tej funkcji do tego samego pliku wsadowego, ponieważ%%a
zmienna zawsze wydaje się podawać ostatnią wartość w pętli for.replace.bat
:źródło
Spójrz na Czy istnieje jakieś narzędzie typu sed dla cmd.exe, które poprosiło o odpowiednik sed w systemie Windows, powinno również dotyczyć tego pytania. Streszczenie:
źródło
Może trochę się spóźniam, ale często szukam podobnych rzeczy, ponieważ nie chcę się męczyć z zatwierdzeniem oprogramowania.
Jednak zwykle używasz instrukcji FOR w różnych formach. Ktoś utworzył przydatny plik wsadowy, który wyszukuje i zamienia. Spójrz tutaj . Ważne jest zrozumienie ograniczeń dostarczonego pliku wsadowego. Z tego powodu nie kopiuję kodu źródłowego w tej odpowiedzi.
źródło
Dwa pliki wsadowe, które zawierają
search and replace
funkcje, zostały zapisane przez członków przepełnienia stosudbenham
iaacini
za pomocąnative built-in jscript
w systemie Windows.Oba są
robust
i sąvery swift with large files
porównywane z prostymi skryptami wsadowymi, a takżesimpler
do podstawowego zastępowania tekstu. Oba mająWindows regular expression
dopasowanie wzorca.Ten
sed-like
plik wsadowy pomocnika nazywa sięrepl.bat
(przez dbenham).Przykład użycia
L
przełącznika literału:Ten
grep-like
plik wsadowy pomocnika nazywa sięfindrepl.bat
(przez aacini).Przykład z aktywnymi wyrażeniami regularnymi:
Oba stają się potężnymi narzędziami ogólnosystemowymi
when placed in a folder that is on the path
lub mogą być używane w tym samym folderze z plikiem wsadowym lub z wiersza poleceń cmd.Oba mają
case-insensitive
przełączniki, a także wiele innych funkcji.źródło
Polecenie Power Shell działa jak urok
źródło
Właśnie napotkałem podobny problem - „Wyszukaj i zamień tekst w plikach”, ale z wyjątkiem tego, że zarówno dla nazw plików, jak i wyszukiwania / repalce muszę użyć wyrażenia regularnego. Ponieważ nie znam Powershell i chcę zapisać moje wyszukiwania do późniejszego użycia, potrzebuję czegoś bardziej „przyjaznego dla użytkownika” (najlepiej, jeśli ma GUI).
Tak więc, podczas korzystania z Google'a :) znalazłem świetne narzędzie - FAR (Znajdź i zamień) (nie FART).
Ten mały program ma ładne GUI i obsługuje wyrażenie regularne do wyszukiwania w nazwach plików i plikach. Jedyną wadą jest to, że jeśli chcesz zapisać ustawienia, musisz uruchomić program jako administrator (przynajmniej na Win7).
źródło
Wolę korzystać
sed
z narzędzi GNU dla Win32 , należy zwrócić uwagę na następujące kwestieTak więc działający kod
sed
znajdowania i zastępowania tekstu w pliku w systemie Windows jest następującyźródło
-i
! Jeśli twoja wersja sed tak, sprawdź polecenie z tej odpowiedzi: stackoverflow.com/a/33762001/2492801 .Jest to jedna rzecz, której skryptowanie po prostu nie działa dobrze.
Skrypt morechilli, do którego prowadzi link, będzie działał dla niektórych plików, ale niestety dusi się na tych, które zawierają znaki, takie jak potoki i znaki handlowe.
VBScript jest lepszym wbudowanym narzędziem do tego zadania. Zobacz ten artykuł na przykład: http://www.microsoft.com/technet/scriptcenter/resources/qanda/feb05/hey0208.mspx
źródło
@Rachel udzielił doskonałej odpowiedzi, ale oto jej odmiana do odczytu treści do
$data
zmiennej PowerShell . Następnie możesz łatwo manipulować treścią wiele razy przed zapisaniem do pliku wyjściowego. Zobacz także, jak podane są wartości wieloliniowe w plikach wsadowych .bat.źródło
Użyj programu PowerShell w .bat - dla systemu Windows 7+
kodowanie utf8 jest opcjonalne, dobre dla stron internetowych
źródło
Pobierz Cygwin (bezpłatny) i użyj poleceń uniksopodobnych w wierszu poleceń systemu Windows.
Twój najlepszy zakład: sed
źródło
Można również zobaczyć narzędzia Replace i ReplaceFilter na https://zoomicon.github.io/tranXform/ (dołączone źródło). Drugi to filtr.
Narzędzie zastępujące ciągi znaków w plikach jest w języku VBScript (wymaga hosta skryptów systemu Windows [WSH] do działania w starszych wersjach systemu Windows)
Filtr prawdopodobnie nie działa z Unicode, chyba że rekompilujesz z najnowszym Delphi (lub FreePascal / Lazarus)
źródło
Napotkałem ten problem kilka razy podczas kodowania w Visual C ++. Jeśli go masz, możesz użyć narzędzia Visual Studio Find and Replace Utility. Pozwala wybrać folder i zastąpić zawartość dowolnego pliku w tym folderze dowolnym innym tekstem.
W Visual Studio: Edycja -> Znajdź i zamień W otwartym oknie dialogowym wybierz folder i wypełnij pola „Znajdź co” i „Zamień na”. Mam nadzieję, że to będzie pomocne.
źródło