>> поиск и замена текста в файлах средствами cmd/bat файла.
Многие администраторы и Power-пользователи линукс, при знакомстве с возможностями cmd, замечают такую досадную деталь, как отсутствие множества утилит для поиска и замены подстрок в файлах.
Вообще под windows существует множество утилит для обработки строк в файлах, в том числе и портированных с #nix систем (тот же sed и supersed), но мы не ищем легких путей это будет не совсем чисто, т.к. в нужный момент этого всего может не оказаться под рукой.
Возможна ли реализация данной функции на cmd ? Конечно! А поможет нам в этом специальные строки расширения, а точнее конструкция вида %переменная:A=B%, где переменная- переменная содержащая исходную подстроку, A – подстрока которую ищем, B – подстрока на которую меняем искомую подстроку в строке.
Приступим писать наш код, т.к. он очень похож на тот что выше, особо вдаваться в детали я не буду:
>> создание динамических переменных в bat-файлах? легко!
При написании сценариев командной строки, у администраторов, которые, хотя бы немного программировали на других языках программирования (а cmd можно отнести к ним с натяжкой) возникает определенный дискомфорт при обработке больших массивов данных. Ведь в cmd отсутствуют массивы!
Например есть текстовый файл, нам нужно его прочитать и вывести определенные строки на экран, покажу как это сделать при помощи динамических переменных.
Для начала создадим файл greeka.txt с таким содержимым:
1.Ехал Грека через реку,Видит Грека – в реке рак.
2.Ехал Грека через реку,Видит Грека – в реке рак.
3.Ехал Грека через реку,Видит Грека – в реке рак.
4.Ехал Грека через реку,Видит Грека – в реке рак.
5.Ехал Грека через реку,Видит Грека – в реке рак.
6.Ехал Грека через реку,Видит Грека – в реке рак.
7.Ехал Грека через реку,Видит Грека – в реке рак.
8.Ехал Грека через реку,Видит Грека – в реке рак.
9.Ехал Грека через реку,Видит Грека – в реке рак.
10.Ехал Грека через реку,Видит Грека – в реке рак.
Далее, приступим к написанию нашего сценария:
[cmd] поиск текста в файле и замена на другой
мак получать не нужно, он известен и заранее записан в таблицу. его просто нужно записать в переменную
—- Automatically Merged Double Post —-
не нужно брать имя компа и модель из системы. их нужно подставлять из файла.
т.е. скрипт должен получить только серийник. он его и получает.
далее, в файле, который я указал выше, нужно найти этот серийник и подставить в переменные соответствующие данные из таблицы:
имя компа, модель, мак-адрес
т.е. к примеру, скрипт определил, что серийный номер – 5SQ3F5J
значит в соответствии с таблицей, должны быть определены переменные типа:
name = MSK-TANISIN
mac = 34-e6-d7-56-09-24
model = dell_7010
—- Automatically Merged Double Post —-
т.е. строку 5SQ3F5J/MSK-TANISIN/34-e6-d7-56-09-24/dell_7010 нужно разобрать на соответствующие переменные. надеюсь, правильно объяснил суть.
§
мак получать не нужно, он известен и заранее записан в таблицу. его просто нужно записать в переменную
—- Automatically Merged Double Post —-
не нужно брать имя компа и модель из системы. их нужно подставлять из файла.
т.е. скрипт должен получить только серийник. он его и получает.
далее, в файле, который я указал выше, нужно найти этот серийник и подставить в переменные соответствующие данные из таблицы:
имя компа, модель, мак-адрес
т.е. к примеру, скрипт определил, что серийный номер – 5SQ3F5J
значит в соответствии с таблицей, должны быть определены переменные типа:
name = MSK-TANISIN
mac = 34-e6-d7-56-09-24
model = dell_7010
—- Automatically Merged Double Post —-
т.е. строку 5SQ3F5J/MSK-TANISIN/34-e6-d7-56-09-24/dell_7010 нужно разобрать на соответствующие переменные. надеюсь, правильно объяснил суть.
How to replace substrings in windows batch file
SET string=bath Abath Bbath XYZbathABC
SET modified=%string:bath=hello%
ECHO %string%
ECHO %modified%
EDIT
Didn’t see at first that you wanted the replacement to be preceded by reading the string from a file.
Well, with a batch file you don’t have much facility of working on files. In this particular case, you’d have to read a line, perform the replacement, then output the modified line, and then… What then? If you need to replace all the ocurrences of ‘bath’ in all the file, then you’ll have to use a loop:
@ECHO OFF
SETLOCAL DISABLEDELAYEDEXPANSION
FOR /F %%L IN (file.txt) DO (
SET "line=%%L"
SETLOCAL ENABLEDELAYEDEXPANSION
ECHO !line:bath=hello!
ENDLOCAL
)
ENDLOCAL
You can add a redirection to a file:
ECHO !line:bath=hello!>>file2.txt
Or you can apply the redirection to the batch file. It must be a different file.
EDIT 2
Added proper toggling of delayed expansion for correct processing of some characters that have special meaning with batch script syntax, like !
, ^
et al. (Thanks, jeb!)
Замена какой-либо части строки
Вы можете использовать символ “*” для определения того, что обработке подлежит часть строки, предшествующая указанному выражением. Я не знаю, как написать это по-человечески, вот что я имею ввиду:
К сожалению, “звёздочкой” нельзя указать, что отсечь надо часть строки после указанного выражения. Эта задача решается в два этапа:
- в отдельную переменную помещается строка, из которой удалено всё, что находится до ключевого выражения. Т.е. в ней остается “хвост”, искомое выражение плюс всё, что после него.
- затем из оригинальной переменной удаляется значение переменной, полученной на первом шаге. Здесь потребуется вызов команды СALL:
Инструкция CALL необходима для разворачивания значения переменной, подлежащей замене. Без неё интерпретатор отработает неверно, и вот эта конструкция не сработает:
Замена символов/подстроки в переменной командной строки
Это то, что мне было нужно в первую очередь. Напомню, моя задача в первую очередь избавиться от двоеточий.
Решается очень просто:
[code]set mytime=%time::=_%[/code]В этом примере используется синтаксис вида:
[code]%Переменная:ЧтоНайти=НаЧтоЗаменить%[/code]В моем случае заменяется двоеточие на символ нижнего подчеркивания, и результат выглядит так:
Само собой, можно заменять не отдельные символы, а целые словосочетания:
Как ещё можно воспользоваться функцией замены? Например:
Как найти и заменить текст в файле, используя среду командной строки windows?
Примечание. Обязательно посмотрите обновление в конце этого ответа, чтобы найти ссылку на превосходный JREPL.BAT, который заменяет REPL.BAT JREPL.BAT 7.0 и более поздних
версий, поддерживает Юникод (UTF-16LE) через эту /UTF
опцию, а также любые другие. другой набор символов, включая UTF-8, через ADO !!!!
Я написал небольшую гибридную утилиту JScript / batch REPL.BAT, которая очень удобна для изменения файлов ASCII (или расширенного ASCII) через командную строку или пакетный файл. Чисто собственный сценарий не требует установки какого-либо стороннего исполняемого файла, и он работает на любой современной версии Windows начиная с XP. Это также очень быстро, особенно по сравнению с чистыми пакетными растворами.
REPL.BAT просто читает стандартный ввод, выполняет поиск и замену регулярных выражений JScript и записывает результат в стандартный вывод.
Вот тривиальный пример того, как заменить foo на bar в test.txt, если предположить, что REPL.BAT находится в вашей текущей папке или, что еще лучше, где-то в вашей переменной PATH:
type test.txt|repl "foo" "bar" >test.txt.new
move /y test.txt.new test.txt
Возможности регулярного выражения JScript делают его очень мощным, особенно способность заменяющего текста ссылаться на захваченные подстроки из текста поиска.
Я включил в утилиту ряд опций, которые делают ее довольно мощной. Например, объединяяM
и X
позволяет модифицировать двоичные файлы! M
Вариант Многоканальный позволяет осуществлять поиск по нескольким линиям. Опция X
шаблона замены eXtended предоставляет escape-последовательности, которые позволяют включать любое двоичное значение в текст замены.
Вся утилита могла бы быть написана как чистый JScript, но гибридный пакетный файл избавляет от необходимости явно указывать CSCRIPT каждый раз, когда вы хотите использовать утилиту.
Вот скрипт REPL.BAT. Полная документация встроена в скрипт.
@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,"\u2021");
replace=replace.replace(/\x92/g,"\u2021");
replace=replace.replace(/\x93/g,"\u201C");
replace=replace.replace(/\x94/g,"\u201D");
replace=replace.replace(/\x95/g,"\u2022");
replace=replace.replace(/\x96/g,"\u2021");
replace=replace.replace(/\x97/g,"\u2021");
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,"\u2021");
search=search.replace(/\x92/g,"\u2021");
search=search.replace(/\x93/g,"\u201C");
search=search.replace(/\x94/g,"\u201D");
search=search.replace(/\x95/g,"\u2022");
search=search.replace(/\x96/g,"\u2021");
search=search.replace(/\x97/g,"\u2021");
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));
}
ВАЖНОЕ ОБНОВЛЕНИЕ
Я прекратил разработку REPL.BAT и заменил ее на JREPL.BAT. Эта новая утилита имеет все те же функциональные возможности REPL.BAT, а также многое другое:
- Поддержка Unicode UTF-16LE через собственные возможности Unicode CSCRIPT и любой другой набор символов (включая UTF-8) через ADO.
- Чтение непосредственно из / запись непосредственно в файл: нет необходимости в каналах, перенаправлении или команде перемещения.
- Включить пользовательский JScript
- Средство перевода похоже на unix tr, только оно также поддерживает поиск по регулярным выражениям и замену JScript
- Отменить несоответствующий текст
- Префикс выходных строк с номером строки
- и более…
Как всегда, полная документация встроена в скрипт.
Оригинальное тривиальное решение теперь стало еще проще:
jrepl "foo" "bar" /f test.txt /o -
Текущая версия JREPL.BAT доступна на DosTips . Прочитайте все последующие сообщения в ветке, чтобы увидеть примеры использования и историю развития.
Как через cmd заменить n-ую строку в текстовом файле?
Здравствуйте. Сабж. Надо заменить 13ю строку в файле на заранее известную. Пишу так
for /f “skip=12” in (settings.ini) do (echo dparm=BIND=0,lck=’ru’,APP=’GPS’,HST=’%COMPUTERNAME%’)
По задумке должно пропустить 12 строк с начала файла и заменить на то, что указано в скобках. По факту – ноль реакции. Возможно, надо еще прервать цикл, т.к. замена производится один раз, но не уверен, это предположение, раньше с смд дел не имел.
Ответ 1
Многие ответы здесь помогли мне указать верное направление, однако ни один из них не подошел для меня, поэтому я публикую свое решение.
У меня Windows 7, которая поставляется со встроенным PowerShell. Вот скрипт, который я использовал для поиска/замены всех экземпляров текста в файле:
powershell -Command "(gc myFile.txt) -replace 'foo', 'bar' | Out-File -encoding ASCII myFile.txt"
Чтобы объяснить это:
Powershell.exe уже должен быть частью вашего оператора PATH, но если нет, вы можете добавить его. Его расположение на моей машине: C:WINDOWSsystem32WindowsPowerShellv1.0
Ответ 11
Когда вы работаете с Git в Windows, просто запустите git-bash
и используйте sed. Или, используя Windows 10, запустите “Bash в Ubuntu в Windows” (из подсистемы Linux) и используйте sed.
Редактор потока, но может редактировать файлы напрямую, используя следующую команду:
sed -i -e 's/foo/bar/g' filename
-i
используется для редактирования на месте с именем файла.-e
указывает команду для запуска.s
используется для замены найденного выражения “foo” на “bar”, аg
используется для замены найденных совпадений.
Ответ 14
С replacer.bat
1) С опцией e?, которая будет оценивать специальные последовательности символов, такие как nr и последовательности Unicode. В этом случае будут заменены кавычки “Foo” и “Bar”:
call replacer.bat "e?C:content.txt" "u0022Foou0022" "u0022Baru0022"
2) Прямая замена, где Foo и Bar не указаны.
call replacer.bat "C:content.txt" "Foo" "Bar"
Ответ 16
Взгляните на Есть ли какая-либо утилита sed для cmd.exe, которая запрашивала эквивалент sed под Windows, также должна применяться к этому вопросу. Краткое содержание:
- Это можно сделать в пакетном файле, но это не очень.
- Множество доступных сторонних исполняемых файлов, которые сделают это для вас, если у вас есть роскошь установки или просто копирования через exe
- Может быть сделано с VBScript или аналогичным, если вам нужно что-то, что можно запустить в окне Windows без изменений и т.д.
Ответ 20
Просто столкнулся с аналогичной проблемой – “Искать и заменять текст в файлах”, но, за исключением того, что для обоих имен файлов и поиска /repalce мне нужно использовать регулярное выражение. Поскольку я не знаком с Powershell и хочу сохранить мои поиски для последующего использования, мне нужно что-то более “удобное для пользователя” (желательно, если у него есть GUI).
Итак, в то время как Googling:) я нашел отличный инструмент – FAR (Найти и заменить) (а не FART).
Эта небольшая программа имеет приятный графический интерфейс и поддерживает регулярное выражение для поиска в именах файлов и внутри файлов. Только disadventage заключается в том, что если вы хотите сохранить свои настройки, вы должны запустить программу в качестве администратора (по крайней мере, на Win7).
Ответ 22
Для простой замены строк в файлах я использую с тех пор свободные Xchang32.exe из Коллекция Clay Utilities for Win32.
У него есть несколько вариантов быстрой замены строк в текстовых файлах, а также байтов в двоичных файлах. Он поддерживает также подстановочные знаки в строке имени файла и может быть выполнен по этой причине также для всех файлов в каталоге, соответствующем шаблону подстановочного знака.
И ничто другое не требуется для этого небольшого 32-битного консольного приложения, чем файл Xchang32.exe, извлеченный из ZIP файла, в любую директорию, такую как каталог пакетного файла, вызывающий его для замены (s).
Пример:
Xchang32.exe MyBinaryFile.bin "^x03" "^x02^x05"
Эта командная строка заменяет в файле MyBinaryFile.bin каждый байт значением 3 на два байта со значениями 2 и 5.
Общей проблемой с использованием wmic является то, что выход является файлом Unicode, хотя все символы определенно находятся в диапазоне символов ASCII, т.е. имеют значение кодовой точки ниже десятичного числа 128.
Этот небольшой пакетный код с использованием Xchang32 преобразует выходной файл wmic Unicode, содержащий только символы ASCII в текстовый файл ASCII.
Ответ 23
@Rachel дал отличный ответ, но вот его вариант, чтобы прочитать содержимое переменной powershell $data. Затем вы можете легко манипулировать контентом несколько раз перед записью в выходной файл. Также посмотрите, как многострочные значения задаются в пакетных файлах .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%"
Ответ 25
Я предпочитаю использовать sed из утилит GNU для Win32, необходимо отметить следующее
- одинарная кавычка
''
не будет работать в Windows, вместо этого используйте""
sed -i
не будет работать в Windows, для этого потребуется обмен файлами
Таким образом, рабочий код sed для поиска и замены текста в файле в Windows, как показано ниже
sed -e "s/foo/bar/g" test.txt > tmp.txt && mv tmp.txt test.txt
Ответ 3
Просто используется FART ( ” F ind A nd R eplace T ext” утилита командной строки): отличное небольшое бесплатное ПО для замены текста в большом наборе файлов.
Файлы настроек находятся на SourceForge.
Пример использования:
fart.exe -p -r -c -- C:toolsperl-5.8.9* @@[email protected]@ C:tools
проведет предварительный просмотр замещений, чтобы сделать рекурсивно в файлах этого дистрибутива Perl.
Только проблема: значок веб-сайта FART не совсем со вкусом, утончен или элегантен;)
Ответ 5
Создать файл 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
Чтобы использовать этот измененный script (который хорошо вызывает replace.vbs), просто введите в командной строке команду, похожую на это:
cscript replace.vbs “C:ScriptsText.txt” “Jim ” “James ”
Ответ 8
Используйте утилиту fnr. Он получил некоторые преимущества перед fart:
- Регулярные выражения
- Дополнительный графический интерфейс. Имеет кнопку “Создать командную строку” для создания текста командной строки для помещения в командный файл.
- Многострочные шаблоны: GUI позволяет вам легко работать с многострочными шаблонами. В FART вы должны вручную избегать разрывов строк.
- Позволяет выбрать кодировку текстового файла. Также есть опция автоматического определения.