Jak znaleźć i zamienić tekst w pliku za pomocą środowiska wiersza poleceń systemu Windows?


492

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?



użyj tego:echo(%text:%search%=%replace%%)
scientist_7

Odpowiedzi:


308

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:

powershell -Command "(gc myFile.txt) -replace 'foo', 'bar' | Out-File -encoding ASCII myFile.txt"

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( gcjest skrótem od Get-Contentpolecenia)
  • -replace 'foo', 'bar'po prostu uruchamia polecenie wymiany do wymiany foozbar
  • | Out-File myFile.txt przesyła dane wyjściowe do pliku myFile.txt
  • -encoding ASCII zapobiega transkrybowaniu pliku wyjściowego do Unicode, jak wskazują komentarze

Program Powershell.exe powinien już być częścią instrukcji PATH, ale jeśli nie, możesz go dodać. Jego lokalizacja na moim komputerze toC:\WINDOWS\system32\WindowsPowerShell\v1.0


71
Uwaga, to polecenie może także transkodować plik do kodowania Unicode. Można ręcznie określić kodowanie poprzez dodanie -encoding ASCIIlub UTF8czy 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.
Wyck

78
@ Wyck Zajęło mi trochę czasu, aby dowiedzieć się, gdzie umieścić -encoding ASCII. Dla każdego, kto będzie tego potrzebował w przyszłości, będzie toOut-File -encoding ASCII myFile.txt
rwilson04

15
Jedyne, co musiałem zmienić, to użyć Set-Contentzamiast Out-File.
kurtzmarc

6
To działa, ale wydajność jest okropna nawet na krótkiej liście plików.
jsuddsjr

23
Uwaga: token zastępujący (w tym przypadku „foo”) jest traktowany jako wyrażenie regularne. Jeśli masz jakieś znaki specjalne (miałem []), musisz je poprzedzić znakiem \ (odwrotny ukośnik).
JW

183

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.

(Get-Content test.txt) | ForEach-Object { $_ -replace "foo", "bar" } | Set-Content test2.txt

10
Widzę, że PowerShell może to archiwizować. Ale jak mogę uruchomić to z pliku wsadowego (przykład: myProc.bat)?
Pablo Venturino

3
@Pablo, użyj powershell.exe i zawiń polecenie ps w jednym parametrze
lubos hasko

56
-1 .. Pewnie odpowiedź została zaakceptowana, ale nie jest to odpowiedź na określone pytanie.
baash05

28
To się nie powiedzie z błędem pliku w użyciu, jeśli zapiszesz w tym samym pliku. Musisz zmienić polecenie powershell na: (Get-Content test.txt) | ForEach-Object {$ _ -replace „foo”, „bar”} |
Test

6
Zobacz odpowiedź @Rachel:powershell -Command "(gc myFile.txt) -replace 'foo', 'bar' | sc myFile.txt"
Nigel Touch

161

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:

fart.exe -p -r -c -- C:\tools\perl-5.8.9\* @@APP_DIR@@ C:\tools

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ç


19
Fajne jest to, że jest to jeden exe. Bez zależności. Bez małych odcisków. Bardzo łatwe do wdrożenia.
Serge Wautier

2
Bardzo lekki i łatwy w użyciu, ale miałem nadzieję, że wydrukuje dokładne miejsca wymiany. Brak możliwości dostrzeżenia poczułem niepewność.
William Niu,

4
Dzięki, jest idealny, powinien być częścią standardowych narzędzi DOS i działał uroczo. Opcja -p nie pokazuje jednak, ile zmian dokonałaby i zawsze zgłasza 0, które rzuciły mnie na kilka minut
sradforth

3
Rozumiem, że to bardzo stare pytanie, ale znalazłem więcej informacji i mam nadzieję, że przydadzą się użytkownikom stosu przepełnienia. Kolejny link do FART, w którym produkt jest dobrze wyjaśniony: FART wyjaśnił @ emtunc.org, a inną stronę można znaleźć tutaj: FART Proszę zachować ostrożność przy wymianie /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/
Jagb

4
@jagb Dziękuję. W odpowiedzi umieściłem twój link, aby zwiększyć widoczność.
VCC

128

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.

set str=teh cat in teh hat
echo.%str%
set str=%str:teh=the%
echo.%str%

Wyjście skryptu:

teh cat in teh hat
the cat in the hat

ref: http://www.dostips.com/DtTipsStringManipulation.php#Snippets.Replace


30
Jaka jest sugestia sed? To wydaje się być najprostszą z nich wszystkich i nie wymaga instalowania niczego.
DonBecker,

5
Czy można tutaj dopasować wzór? Symbole wieloznaczne, Regex itp.?
Keyo

27
„W jaki sposób sugestia sed jest lepsza?” - sed i podobne narzędzia działają na plikach; fragment ten pomija ważny krok odczytywania wierszy z pliku wejściowego i zapisywania do pliku wyjściowego, zapewniając jednocześnie, że wszelkie znaki specjalne w pliku są obsługiwane poprawnie.
Joe

7
@Asad, tak, to prawda, OP pytał o pliki, ale w rzeczywistości działa ze strumieniami, które nie muszą być plikami. Chodzi mi jednak o to, że ta odpowiedź jest błędna, ponieważ pomija czytanie / pisanie ze strumienia i obsługę znaków specjalnych.
Joe

4
@ Bill, jak używać zmiennej jako tekstu zastępującego? to znaczy. Mam wartość w zmiennej i łańcuch, który ma pewien separator. set str =% str: "##" =% varValue %% nie działa. Jakieś obejścia?
MalTec

55

Utwórz plik replace.vbs:

Const ForReading = 1    
Const ForWriting = 2

strFileName = Wscript.Arguments(0)
strOldText = Wscript.Arguments(1)
strNewText = Wscript.Arguments(2)

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile(strFileName, ForReading)
strText = objFile.ReadAll
objFile.Close

strNewText = Replace(strText, strOldText, strNewText)
Set objFile = objFSO.OpenTextFile(strFileName, ForWriting)
objFile.Write strNewText  'WriteLine adds extra CR/LF
objFile.Close

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 "


to jest miłe, czy pozwala na użycie RegEx?
user280109

3
@ user280109 Tak, VBScript obsługuje 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.
Szczoteczka do zębów

2
VBScript jest często pomijany (i nienawidzony), ale jest dostępny na wszystkich platformach Windows, jest bardzo czytelny i faktycznie ma bardzo potężne możliwości +1
zelanix

1
@ user280109 Właśnie wydałeś polecenie, czego potrzebuję. Ale chcę zastąpić (bez uwzględniania wielkości liter) Czy możesz podać polecenie?
Ajmal Praveen

49

BatchSubstitute.batna dostips.com jest przykładem wyszukiwania i zamiany przy użyciu czystego pliku wsadowego.

Wykorzystuje połączenie FOR, FINDi CALL SET.

Linie zawierające znaki "&<>]|^mogą być traktowane niepoprawnie.



8
Muszę zakwestionować przydatność witryny z fragmentem kodu, której warunki użytkowania zabraniają kopiowania jakiegokolwiek kodu („Nie możesz rozpowszechniać żadnych informacji pod domeną dostips.com w żadnej formie bez wyraźnej pisemnej zgody właściciela domeny”). .
Gilles „SO- przestań być zły”

1
Zgadzam się, że ich warunki są mylące, mówią też „Informacje podane w domenie dostips.com są, mam nadzieję, przydatne”, więc zakładam, że ludzie chętnie kopiują kod w celu rozwiązania problemu. Nie jestem pewien, czy kiedykolwiek zapoznałem się z jakimkolwiek
regulaminem

5
To jest świetne. Uwielbiam odpowiedzi, które nie wymagają pobierania czegoś innego, aby to zrobić.
Ruairi O'Brien

Lubię też rozwiązania, które nie wymagają użycia zewnętrznych narzędzi, niestety ciągle próbuję uruchomić tę partię „znajdź: niepoprawny predykat”. Naprawdę nie mam teraz czasu na debugowanie.
Jahmic

2
Błąd „find: invalid predicate” był spowodowany przez zewnętrzne narzędzie „find” w moim systemie. Po usunięciu zadziałało dobrze.
Jahmic

47

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 /UTFopcji, 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:

type test.txt|repl "foo" "bar" >test.txt.new
move /y test.txt.new test.txt

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 Mi Xumożliwia modyfikację plików binarnych! Opcja MWiele linii umożliwia wyszukiwanie w wielu liniach. Opcja Xrozszerzonego 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.

@if (@X)==(@Y) @end /* Harmless hybrid line that begins a JScript comment

::************ Documentation ***********
::REPL.BAT version 6.2
:::
:::REPL  Search  Replace  [Options  [SourceVar]]
:::REPL  /?[REGEX|REPLACE]
:::REPL  /V
:::
:::  Performs a global regular expression search and replace operation on
:::  each line of input from stdin and prints the result to stdout.
:::
:::  Each parameter may be optionally enclosed by double quotes. The double
:::  quotes are not considered part of the argument. The quotes are required
:::  if the parameter contains a batch token delimiter like space, tab, comma,
:::  semicolon. The quotes should also be used if the argument contains a
:::  batch special character like &, |, etc. so that the special character
:::  does not need to be escaped with ^.
:::
:::  If called with a single argument of /?, then prints help documentation
:::  to stdout. If a single argument of /?REGEX, then opens up Microsoft's
:::  JScript regular expression documentation within your browser. If a single
:::  argument of /?REPLACE, then opens up Microsoft's JScript REPLACE
:::  documentation within your browser.
:::
:::  If called with a single argument of /V, case insensitive, then prints
:::  the version of REPL.BAT.
:::
:::  Search  - By default, this is a case sensitive JScript (ECMA) regular
:::            expression expressed as a string.
:::
:::            JScript regex syntax documentation is available at
:::            http://msdn.microsoft.com/en-us/library/ae5bf541(v=vs.80).aspx
:::
:::  Replace - By default, this is the string to be used as a replacement for
:::            each found search expression. Full support is provided for
:::            substituion patterns available to the JScript replace method.
:::
:::            For example, $& represents the portion of the source that matched
:::            the entire search pattern, $1 represents the first captured
:::            submatch, $2 the second captured submatch, etc. A $ literal
:::            can be escaped as $$.
:::
:::            An empty replacement string must be represented as "".
:::
:::            Replace substitution pattern syntax is fully documented at
:::            http://msdn.microsoft.com/en-US/library/efy6s3e6(v=vs.80).aspx
:::
:::  Options - An optional string of characters used to alter the behavior
:::            of REPL. The option characters are case insensitive, and may
:::            appear in any order.
:::
:::            A - Only print altered lines. Unaltered lines are discarded.
:::                If the S options is present, then prints the result only if
:::                there was a change anywhere in the string. The A option is
:::                incompatible with the M option unless the S option is present.
:::
:::            B - The Search must match the beginning of a line.
:::                Mostly used with literal searches.
:::
:::            E - The Search must match the end of a line.
:::                Mostly used with literal searches.
:::
:::            I - Makes the search case-insensitive.
:::
:::            J - The Replace argument represents a JScript expression.
:::                The expression may access an array like arguments object
:::                named $. However, $ is not a true array object.
:::
:::                The $.length property contains the total number of arguments
:::                available. The $.length value is equal to n+3, where n is the
:::                number of capturing left parentheses within the Search string.
:::
:::                $[0] is the substring that matched the Search,
:::                $[1] through $[n] are the captured submatch strings,
:::                $[n+1] is the offset where the match occurred, and
:::                $[n+2] is the original source string.
:::
:::                Arguments $[0] through $[10] may be abbreviated as
:::                $1 through $10. Argument $[11] and above must use the square
:::                bracket notation.
:::
:::            L - The Search is treated as a string literal instead of a
:::                regular expression. Also, all $ found in the Replace string
:::                are treated as $ literals.
:::
:::            M - Multi-line mode. The entire contents of stdin is read and
:::                processed in one pass instead of line by line, thus enabling
:::                search for \n. This also enables preservation of the original
:::                line terminators. If the M option is not present, then every
:::                printed line is terminated with carriage return and line feed.
:::                The M option is incompatible with the A option unless the S
:::                option is also present.
:::
:::                Note: If working with binary data containing NULL bytes,
:::                      then the M option must be used.
:::
:::            S - The source is read from an environment variable instead of
:::                from stdin. The name of the source environment variable is
:::                specified in the next argument after the option string. Without
:::                the M option, ^ anchors the beginning of the string, and $ the
:::                end of the string. With the M option, ^ anchors the beginning
:::                of a line, and $ the end of a line.
:::
:::            V - Search and Replace represent the name of environment
:::                variables that contain the respective values. An undefined
:::                variable is treated as an empty string.
:::
:::            X - Enables extended substitution pattern syntax with support
:::                for the following escape sequences within the Replace string:
:::
:::                \\     -  Backslash
:::                \b     -  Backspace
:::                \f     -  Formfeed
:::                \n     -  Newline
:::                \q     -  Quote
:::                \r     -  Carriage Return
:::                \t     -  Horizontal Tab
:::                \v     -  Vertical Tab
:::                \xnn   -  Extended ASCII byte code expressed as 2 hex digits
:::                \unnnn -  Unicode character expressed as 4 hex digits
:::
:::                Also enables the \q escape sequence for the Search string.
:::                The other escape sequences are already standard for a regular
:::                expression Search string.
:::
:::                Also modifies the behavior of \xnn in the Search string to work
:::                properly with extended ASCII byte codes.
:::
:::                Extended escape sequences are supported even when the L option
:::                is used. Both Search and Replace support all of the extended
:::                escape sequences if both the X and L opions are combined.
:::
:::  Return Codes:  0 = At least one change was made
:::                     or the /? or /V option was used
:::
:::                 1 = No change was made
:::
:::                 2 = Invalid call syntax or incompatible options
:::
:::                 3 = JScript runtime error, typically due to invalid regex
:::
::: REPL.BAT was written by Dave Benham, with assistance from DosTips user Aacini
::: to get \xnn to work properly with extended ASCII byte codes. Also assistance
::: from DosTips user penpen diagnosing issues reading NULL bytes, along with a
::: workaround. REPL.BAT was originally posted at:
::: http://www.dostips.com/forum/viewtopic.php?f=3&t=3855
:::

::************ Batch portion ***********
@echo off
if .%2 equ . (
  if "%~1" equ "/?" (
    <"%~f0" cscript //E:JScript //nologo "%~f0" "^:::" "" a
    exit /b 0
  ) else if /i "%~1" equ "/?regex" (
    explorer "http://msdn.microsoft.com/en-us/library/ae5bf541(v=vs.80).aspx"
    exit /b 0
  ) else if /i "%~1" equ "/?replace" (
    explorer "http://msdn.microsoft.com/en-US/library/efy6s3e6(v=vs.80).aspx"
    exit /b 0
  ) else if /i "%~1" equ "/V" (
    <"%~f0" cscript //E:JScript //nologo "%~f0" "^::(REPL\.BAT version)" "$1" a
    exit /b 0
  ) else (
    call :err "Insufficient arguments"
    exit /b 2
  )
)
echo(%~3|findstr /i "[^SMILEBVXAJ]" >nul && (
  call :err "Invalid option(s)"
  exit /b 2
)
echo(%~3|findstr /i "M"|findstr /i "A"|findstr /vi "S" >nul && (
  call :err "Incompatible options"
  exit /b 2
)
cscript //E:JScript //nologo "%~f0" %*
exit /b %errorlevel%

:err
>&2 echo ERROR: %~1. Use REPL /? to get help.
exit /b

************* JScript portion **********/
var rtn=1;
try {
  var env=WScript.CreateObject("WScript.Shell").Environment("Process");
  var args=WScript.Arguments;
  var search=args.Item(0);
  var replace=args.Item(1);
  var options="g";
  if (args.length>2) options+=args.Item(2).toLowerCase();
  var multi=(options.indexOf("m")>=0);
  var alterations=(options.indexOf("a")>=0);
  if (alterations) options=options.replace(/a/g,"");
  var srcVar=(options.indexOf("s")>=0);
  if (srcVar) options=options.replace(/s/g,"");
  var jexpr=(options.indexOf("j")>=0);
  if (jexpr) options=options.replace(/j/g,"");
  if (options.indexOf("v")>=0) {
    options=options.replace(/v/g,"");
    search=env(search);
    replace=env(replace);
  }
  if (options.indexOf("x")>=0) {
    options=options.replace(/x/g,"");
    if (!jexpr) {
      replace=replace.replace(/\\\\/g,"\\B");
      replace=replace.replace(/\\q/g,"\"");
      replace=replace.replace(/\\x80/g,"\\u20AC");
      replace=replace.replace(/\\x82/g,"\\u201A");
      replace=replace.replace(/\\x83/g,"\\u0192");
      replace=replace.replace(/\\x84/g,"\\u201E");
      replace=replace.replace(/\\x85/g,"\\u2026");
      replace=replace.replace(/\\x86/g,"\\u2020");
      replace=replace.replace(/\\x87/g,"\\u2021");
      replace=replace.replace(/\\x88/g,"\\u02C6");
      replace=replace.replace(/\\x89/g,"\\u2030");
      replace=replace.replace(/\\x8[aA]/g,"\\u0160");
      replace=replace.replace(/\\x8[bB]/g,"\\u2039");
      replace=replace.replace(/\\x8[cC]/g,"\\u0152");
      replace=replace.replace(/\\x8[eE]/g,"\\u017D");
      replace=replace.replace(/\\x91/g,"\\u2018");
      replace=replace.replace(/\\x92/g,"\\u2019");
      replace=replace.replace(/\\x93/g,"\\u201C");
      replace=replace.replace(/\\x94/g,"\\u201D");
      replace=replace.replace(/\\x95/g,"\\u2022");
      replace=replace.replace(/\\x96/g,"\\u2013");
      replace=replace.replace(/\\x97/g,"\\u2014");
      replace=replace.replace(/\\x98/g,"\\u02DC");
      replace=replace.replace(/\\x99/g,"\\u2122");
      replace=replace.replace(/\\x9[aA]/g,"\\u0161");
      replace=replace.replace(/\\x9[bB]/g,"\\u203A");
      replace=replace.replace(/\\x9[cC]/g,"\\u0153");
      replace=replace.replace(/\\x9[dD]/g,"\\u009D");
      replace=replace.replace(/\\x9[eE]/g,"\\u017E");
      replace=replace.replace(/\\x9[fF]/g,"\\u0178");
      replace=replace.replace(/\\b/g,"\b");
      replace=replace.replace(/\\f/g,"\f");
      replace=replace.replace(/\\n/g,"\n");
      replace=replace.replace(/\\r/g,"\r");
      replace=replace.replace(/\\t/g,"\t");
      replace=replace.replace(/\\v/g,"\v");
      replace=replace.replace(/\\x[0-9a-fA-F]{2}|\\u[0-9a-fA-F]{4}/g,
        function($0,$1,$2){
          return String.fromCharCode(parseInt("0x"+$0.substring(2)));
        }
      );
      replace=replace.replace(/\\B/g,"\\");
    }
    search=search.replace(/\\\\/g,"\\B");
    search=search.replace(/\\q/g,"\"");
    search=search.replace(/\\x80/g,"\\u20AC");
    search=search.replace(/\\x82/g,"\\u201A");
    search=search.replace(/\\x83/g,"\\u0192");
    search=search.replace(/\\x84/g,"\\u201E");
    search=search.replace(/\\x85/g,"\\u2026");
    search=search.replace(/\\x86/g,"\\u2020");
    search=search.replace(/\\x87/g,"\\u2021");
    search=search.replace(/\\x88/g,"\\u02C6");
    search=search.replace(/\\x89/g,"\\u2030");
    search=search.replace(/\\x8[aA]/g,"\\u0160");
    search=search.replace(/\\x8[bB]/g,"\\u2039");
    search=search.replace(/\\x8[cC]/g,"\\u0152");
    search=search.replace(/\\x8[eE]/g,"\\u017D");
    search=search.replace(/\\x91/g,"\\u2018");
    search=search.replace(/\\x92/g,"\\u2019");
    search=search.replace(/\\x93/g,"\\u201C");
    search=search.replace(/\\x94/g,"\\u201D");
    search=search.replace(/\\x95/g,"\\u2022");
    search=search.replace(/\\x96/g,"\\u2013");
    search=search.replace(/\\x97/g,"\\u2014");
    search=search.replace(/\\x98/g,"\\u02DC");
    search=search.replace(/\\x99/g,"\\u2122");
    search=search.replace(/\\x9[aA]/g,"\\u0161");
    search=search.replace(/\\x9[bB]/g,"\\u203A");
    search=search.replace(/\\x9[cC]/g,"\\u0153");
    search=search.replace(/\\x9[dD]/g,"\\u009D");
    search=search.replace(/\\x9[eE]/g,"\\u017E");
    search=search.replace(/\\x9[fF]/g,"\\u0178");
    if (options.indexOf("l")>=0) {
      search=search.replace(/\\b/g,"\b");
      search=search.replace(/\\f/g,"\f");
      search=search.replace(/\\n/g,"\n");
      search=search.replace(/\\r/g,"\r");
      search=search.replace(/\\t/g,"\t");
      search=search.replace(/\\v/g,"\v");
      search=search.replace(/\\x[0-9a-fA-F]{2}|\\u[0-9a-fA-F]{4}/g,
        function($0,$1,$2){
          return String.fromCharCode(parseInt("0x"+$0.substring(2)));
        }
      );
      search=search.replace(/\\B/g,"\\");
    } else search=search.replace(/\\B/g,"\\\\");
  }
  if (options.indexOf("l")>=0) {
    options=options.replace(/l/g,"");
    search=search.replace(/([.^$*+?()[{\\|])/g,"\\$1");
    if (!jexpr) replace=replace.replace(/\$/g,"$$$$");
  }
  if (options.indexOf("b")>=0) {
    options=options.replace(/b/g,"");
    search="^"+search
  }
  if (options.indexOf("e")>=0) {
    options=options.replace(/e/g,"");
    search=search+"$"
  }
  var search=new RegExp(search,options);
  var str1, str2;

  if (srcVar) {
    str1=env(args.Item(3));
    str2=str1.replace(search,jexpr?replFunc:replace);
    if (!alterations || str1!=str2) if (multi) {
      WScript.Stdout.Write(str2);
    } else {
      WScript.Stdout.WriteLine(str2);
    }
    if (str1!=str2) rtn=0;
  } else if (multi){
    var buf=1024;
    str1="";
    while (!WScript.StdIn.AtEndOfStream) {
      str1+=WScript.StdIn.Read(buf);
      buf*=2
    }
    str2=str1.replace(search,jexpr?replFunc:replace);
    WScript.Stdout.Write(str2);
    if (str1!=str2) rtn=0;
  } else {
    while (!WScript.StdIn.AtEndOfStream) {
      str1=WScript.StdIn.ReadLine();
      str2=str1.replace(search,jexpr?replFunc:replace);
      if (!alterations || str1!=str2) WScript.Stdout.WriteLine(str2);
      if (str1!=str2) rtn=0;
    }
  }
} catch(e) {
  WScript.Stderr.WriteLine("JScript runtime error: "+e.message);
  rtn=3;
}
WScript.Quit(rtn);

function replFunc($0, $1, $2, $3, $4, $5, $6, $7, $8, $9, $10) {
  var $=arguments;
  return(eval(replace));
}


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:

  • Obsługa Unicode UTF-16LE poprzez natywne możliwości Unicode CSCRIPT oraz dowolny inny zestaw znaków (w tym UTF-8) przez ADO.
  • Odczytywanie bezpośrednio z / zapisywanie bezpośrednio do pliku: nie ma potrzeby używania potoków, przekierowywania ani przenoszenia.
  • Włącz JScript dostarczony przez użytkownika
  • Funkcja tłumaczenia podobna do unix tr, tylko obsługuje wyszukiwanie wyrażeń regularnych i zamienia JScript
  • Odrzuć niepasujący tekst
  • Przedrostek wierszy wyjściowych z numerem wiersza
  • i więcej...

Jak zawsze pełna dokumentacja jest osadzona w skrypcie.

Oryginalne trywialne rozwiązanie jest teraz jeszcze prostsze:

jrepl "foo" "bar" /f test.txt /o -

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.


Świetne rzeczy! Uwielbiam ten b / c prostoty i sposób, w jaki możesz go dostosować do dowolnego skryptu, stąd pisanie kodu JS niż gówniana partia.
Adaptabi

Edytuj - Dodano opcję A, aby drukować tylko zmodyfikowane linie. Ulepszono również opcję X do obsługi \qreprezentacji ", a literały wyszukiwania obsługują teraz wszystkie rozszerzone sekwencje specjalne, gdy opcje L i X są połączone.
dbenham

@dbenham - +1. Jest to zręczne podejście, przyda się również w przypadku kilku innych zadań. Dzięki za opublikowanie.
mc

EDYCJA - zmodyfikowałem zachowanie \ xnn, gdy używana jest opcja X, aby kod reprezentował rozszerzony kod bajtowy ASCII. Dodano także opcję wersji V
dbenham

9
@dbenham To jest klejnot. Dlaczego nie umieścisz go na GitHub lub jako Gist? Ułatwiłoby przechowywanie wersji, dalsze działania, wydania / dystrybucję, poprawki i jeszcze więcej. Jeśli potrzebujesz pomocy, daj mi znać.
Atif Aziz,

36

Użyj FNR

Użyj fnrnarzędzia. Ma kilka zalet w stosunku do fart:

  • Wyrażenia regularne
  • Opcjonalne GUI. Ma „Generuj przycisk wiersza polecenia”, aby utworzyć tekst wiersza polecenia, aby umieścić go w pliku wsadowym.
  • Wzory wieloliniowe: GUI umożliwia łatwą pracę z wzorami wieloliniowymi. W FART będziesz musiał ręcznie uciec przed łamaniem linii.
  • Pozwala wybrać kodowanie pliku tekstowego. Ma również opcję automatycznego wykrywania.

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"


1
To jest miłe. Możliwość wygenerowania wiersza poleceń z GUI to miła, prosta funkcja, która przyspieszyła moją pracę.
David Hammond

Bardzo przydatne narzędzie. Próbowałem FART wcześniej, ale dokumentacja jest nieaktualna.
Artur Kędzior

Fajne narzędzie, obsługuje nawet wyrażenia regularne. Tego brakuje FART.
Dio Phung,

1
Dziękujemy za wskazanie tego narzędzia. Pojedynczy plik exe, świetny zamiennik FART, który nie jest już rozwijany (i nie ma wyrażenia regularnego); a składnia PowerShell jest bardzo nie do zniesienia.
Gras Double

To jest najbardziej przydatne. Szukałem zamiany grep + sed w systemie Windows, działało to świetnie!
Serban Tanasa,

25

Nie sądzę, żeby można to zrobić za pomocą wbudowanych poleceń. Sugeruję pobranie czegoś takiego jak Gnuwin32 lub UnxUtils i użycie sedpolecenia (lub tylko pobranie sed):

sed -c s/FOO/BAR/g filename

2
Użyj cygwin ( cygwin.com ). To kolejna najlepsza rzecz do zainstalowania Linuksa.
Andrew Johnson,

Lepiej jest, jeśli można dostarczyć rozwiązanie, które nie polega na instalacji cygwina. Manipulowanie łańcuchem POSIX nie jest żadnym problemem - robienie tego w systemie Windows jest nieco bardziej niejasne.
Rex,

4
Gnuwin32 i UnxUtils to samodzielne pliki binarne zbudowane dla systemu Windows. Nie są zależne od cygwina.
Ferruccio,

1
cygwin: 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 LF
Aleksiej Wiszercew

@AndrewJohnson Opinia i informacje to dwie różne rzeczy.
Preza8

21

Wiem, ż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:

DEL New.txt
setLocal EnableDelayedExpansion
For /f "tokens=* delims= " %%a in (OLD.txt) do (
Set str=%%a
set str=!str:FOO=BAR!
echo !str!>>New.txt
)
ENDLOCAL

DEDUPLICATOR (zwróć uwagę na użycie -9 dla numeru ABA):

REM DE-DUPLICATE THE Mapping.txt FILE
REM THE DE-DUPLICATED FILE IS STORED AS new.txt

set MapFile=Mapping.txt
set ReplaceFile=New.txt

del %ReplaceFile%
::DelDupeText.bat
rem https://groups.google.com/forum/#!topic/alt.msdos.batch.nt/sj8IUhMOq6o
setLocal EnableDelayedExpansion
for /f "tokens=1,2 delims=," %%a in (%MapFile%) do (
set str=%%a
rem Ref: http://www.dostips.com/DtTipsStringManipulation.php#Snippets.RightString
set str=!str:~-9!
set str2=%%a
set str3=%%a,%%b

find /i ^"!str!^" %MapFile%
find /i ^"!str!^" %ReplaceFile%
if errorlevel 1 echo !str3!>>%ReplaceFile%
)
ENDLOCAL

Dzięki!


skrypt wsadowy robi tylko zwykłą kopię pliku - także: dlaczego sam sobie dziękujesz?
specializt

Pierwotnym żądaniem było zastąpienie „FOO” „BAR” w pliku tekstowym przy użyciu skryptu wsadowego i najlepiej wbudowanych funkcji. Jeśli cokolwiek dziękowałem postowi w Grupach dyskusyjnych Google, znalazłem, który działa fantastycznie i nadal go używamy do dziś. Zobacz też posty i odpowiedzi takie jak te, które mogą być pomocne dla użytkowników, którzy zejdą z drogi. Nie widzę twojego komentarza na temat kopiowania pliku. Jasne, bierze zawartość jednego pliku i echo wyniku do innego pliku, ale na podstawie danych przycina i analizuje potrzebne informacje. Najpierw poleciłbym spróbować. ;)
Leptonator

jest to w zasadzie narzędzie do kopiowania plików, które zastępuje dwa ciągi statyczne - można było tam umieścić co najmniej dwie zmienne, aby ludzie, którzy chcą go wypróbować, nie musieli rozumieć składni, aby móc z niego korzystać - także: założenia w Internecie są prawie zawsze całkowicie błędne. Zapamietaj to.
specializt

4
@specializt - Proszę ... Nie jestem tu, by dyskutować semantykę. Jeśli chcesz, możemy przenieść to offline do pokoju rozmów.
Leptonator

2
Moim zdaniem to jest odpowiedź na oryginalne pytanie. Będę używać tej wskazówki do konfigurowania plików inicjujących usługę podczas instalacji i nie chcę włączać programu PowerShell ani zezwalać na uruchamianie silnika skryptów na moich serwerach. Tak często odpowiedzi na pytania związane z oknami, zacznij od „zainstaluj to Gizmo stamtąd”, ponieważ nadal istnieje podejście „PC”.
mico

15

Kiedy pracujesz z Git na Windows, po prostu odpal git-bash i używaj sed. Lub, korzystając z systemu Windows 10, uruchom „Bash na Ubuntu w systemie Windows” (z podsystemu Linux) i użyj sed.

Jest to edytor strumieniowy, ale może edytować pliki bezpośrednio za pomocą następującego polecenia:

sed -i -e 's/foo/bar/g' filename
  • -i Opcja służy do edycji w miejscu nazwy pliku.
  • -e opcja wskazuje polecenie do uruchomienia.
    • ssłuży do zamiany znalezionego wyrażenia „foo” na „słupek” i gdo 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.


1
Zauważ, że jeśli faktycznie robisz tę zmianę nazwy w repozytorium git i chcesz tylko zastąpić pliki z wersją, możesz zrobić: git ls-files <eventual subfolders & filters> | xargs sed -i -e 's/foo/bar/g'co działa cuda.
ereOn

13

Bawiłem się niektórymi z istniejących odpowiedzi tutaj i wolę moje ulepszone rozwiązanie ...

type test.txt | powershell -Command "$input | ForEach-Object { $_ -replace \"foo\", \"bar\" }"

lub jeśli chcesz ponownie zapisać wynik w pliku ...

type test.txt | powershell -Command "$input | ForEach-Object { $_ -replace \"foo\", \"bar\" }" > outputFile.txt

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 ... :-(


3
To dobre rozwiązanie. Niestety, użycie typeoznacza , że wszystkie linie większe niż 80 znaków są zawijane. Co za ból.
sirdank

12

Użyłem perla i to działa cudownie.

perl -pi.orig -e "s/<textToReplace>/<textToReplaceWith>/g;" <fileName>

.orig to rozszerzenie, które dołącza do oryginalnego pliku

Dla wielu pasujących plików, takich jak * .html

for %x in (<filePattern>) do perl -pi.orig -e "s/<textToReplace>/<textToReplaceWith>/g;" %x

Jest to najprostsze rozwiązanie +1, podczas konwersji z sh do bat, wystarczy wymienić sedze perl -pi.backup -ei to doceniam :)
Yann39

11

Z replaceer.bat

1) Z e?opcją, która będzie oceniać sekwencje znaków specjalnych, takie jak \n\rsekwencje Unicode. W takim przypadku zastąpi cytowany "Foo"i "Bar":

call replacer.bat "e?C:\content.txt" "\u0022Foo\u0022" "\u0022Bar\u0022"

2) Prosta zamiana tam, gdzie Fooi Barnie są cytowane.

call replacer.bat "C:\content.txt" "Foo" "Bar"

to nie działa dla mnie. Jak to robisz? Otrzymuję błąd „replace_in_config.bat” nie jest rozpoznawany jako polecenie wewnętrzne lub zewnętrzne, program operacyjny lub plik wsadowy.
FrenkyB,

@FrenkyB - musi znajdować się w tym samym katalogu, w którym go wywołujesz, lub na ścieżce - ss64.com/nt/path.html
npocmaka

Mam wszystkie trzy pliki w tym samym katalogu.
FrenkyB

9

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:

set value=new_value

:: Setup initial configuration
:: I use && as the delimiter in the file because it should not exist, thereby giving me the whole line
::
echo --> Setting configuration and properties.
for /f "tokens=* delims=&&" %%a in (config\config.txt) do ( 
  call replace.bat "%%a" _KEY_ %value% config\temp.txt 
)
del config\config.txt
rename config\temp.txt config.txt

replace.batPliku jest jak poniżej. Nie znalazłem sposobu na włączenie tej funkcji do tego samego pliku wsadowego, ponieważ %%azmienna zawsze wydaje się podawać ostatnią wartość w pętli for.

replace.bat:

@echo off

:: This ensures the parameters are resolved prior to the internal variable
::
SetLocal EnableDelayedExpansion

:: Replaces Key Variables
::
:: Parameters:
:: %1  = Line to search for replacement
:: %2  = Key to replace
:: %3  = Value to replace key with
:: %4  = File in which to write the replacement
::

:: Read in line without the surrounding double quotes (use ~)
::
set line=%~1

:: Write line to specified file, replacing key (%2) with value (%3)
::
echo !line:%2=%3! >> %4

:: Restore delayed expansion
::
EndLocal

1
Niestety pomija to również puste linie. Funkcja z {{do}} polecenia.
John Rocha,

7

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:

  • Można to zrobić w pliku wsadowym, ale to nie jest ładne
  • Wiele dostępnych plików wykonywalnych innych firm, które zrobią to za Ciebie, jeśli masz luksus instalowania lub kopiowania exe
  • Można to zrobić za pomocą VBScript lub podobnego, jeśli potrzebujesz czegoś, co można uruchomić na komputerze z systemem Windows bez modyfikacji itp.

4

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.


4

Dwa pliki wsadowe, które zawierają search and replacefunkcje, zostały zapisane przez członków przepełnienia stosu dbenhami aaciniza pomocąnative built-in jscript w systemie Windows.

Oba są robusti są very swift with large filesporównywane z prostymi skryptami wsadowymi, a także simplerdo podstawowego zastępowania tekstu. Oba mają Windows regular expressiondopasowanie wzorca.

  1. Ten sed-likeplik wsadowy pomocnika nazywa się repl.bat(przez dbenham).

    Przykład użycia Lprzełącznika literału:

    echo This is FOO here|repl "FOO" "BAR" L
    echo and with a file:
    type "file.txt" |repl "FOO" "BAR" L >"newfile.txt"
    
  2. Ten grep-likeplik wsadowy pomocnika nazywa sięfindrepl.bat (przez aacini).

    Przykład z aktywnymi wyrażeniami regularnymi:

    echo This is FOO here|findrepl "FOO" "BAR" 
    echo and with a file:
    type "file.txt" |findrepl "FOO" "BAR" >"newfile.txt"
    

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-insensitiveprzełączniki, a także wiele innych funkcji.


3

Polecenie Power Shell działa jak urok

(
test.txt | ForEach-Object { $_ -replace "foo", "bar" } | Set-Content test2.txt
)

3

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).


To ta sama odpowiedź, co odpowiedź z 2010 roku @VonC W tym wątku
jeb

@jeb Wskazałem, że FAR to nie FART - dwa różne programy o prawie identycznych nazwach. FAR ma GUI i może pracować z regex, podczas gdy w komentarzach poniżej tego wątku ludzie wspominają, że FART nie obsługuje regex.
madcorp

3

Wolę korzystać sedz narzędzi GNU dla Win32 , należy zwrócić uwagę na następujące kwestie

  • pojedynczy cytat ''nie będzie działał w systemie Windows, ""zamiast tego użyj
  • sed -inie będzie działać w systemie Windows, będzie wymagać wymiany plików

Tak więc działający kod sedznajdowania i zastępowania tekstu w pliku w systemie Windows jest następujący

sed -e "s/foo/bar/g" test.txt > tmp.txt && mv tmp.txt test.txt

2
Zanim użytkownicy systemu Windows natychmiast dokonają zamiany plików: nowsze wersje sed obsługują edycję w miejscu za pomocą -i! Jeśli twoja wersja sed tak, sprawdź polecenie z tej odpowiedzi: stackoverflow.com/a/33762001/2492801 .
Benjamin Bihler

2

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


2

@Rachel udzielił doskonałej odpowiedzi, ale oto jej odmiana do odczytu treści do $datazmiennej 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.

@REM ASCII=7bit ascii(no bom), UTF8=with bom marker
set cmd=^
  $old = '\$Param1\$'; ^
  $new = 'Value1'; ^
  [string[]]$data = Get-Content 'datafile.txt'; ^
  $data = $data -replace $old, $new; ^
  out-file -InputObject $data -encoding UTF8 -filepath 'datafile.txt';
powershell -NoLogo -Noninteractive -InputFormat none -Command "%cmd%"

2

Użyj programu PowerShell w .bat - dla systemu Windows 7+

kodowanie utf8 jest opcjonalne, dobre dla stron internetowych

@echo off
set ffile='myfile.txt'
set fold='FOO'
set fnew='BAR'
powershell -Command "(gc %ffile%) -replace %fold%, %fnew% | Out-File %ffile% -encoding utf8"

1

Pobierz Cygwin (bezpłatny) i użyj poleceń uniksopodobnych w wierszu poleceń systemu Windows.

Twój najlepszy zakład: sed


10
Cygwin jest zły. Nie instaluj go. Lepsze wykorzystanie UnixUtils wymienionych poniżej.
zedoo,

24
Co w tym złego?
jm.

@jm Być może dlatego, że musisz zainstalować całość razem zamiast używać jednego pliku wykonywalnego, kiedy tylko chcesz.
Andry

Lepiej użyj PowerShell, w rzeczywistości jest on wbudowany w Windows.
Preza8

0

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)


-5

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.


2
Nadjib, twoja odpowiedź nie pomaga użytkownikowi, ponieważ zakładasz, że używa oprogramowania, o którym nie wspomina. Proszę zasugerować opcję, która nie wymaga oprogramowania.
Aibrean

@Aibrean odpowiedź nie ma sensu, ale nie z tego powodu, to punkt wejścia jest zły.
Paul
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.