.bat Найти и заменить текст

У меня есть несколько файлов, которые содержат некоторые из следующих элементов, если не все:

Программа RxBIN RXPCN RxGroup MemberID

не все файлы будут иметь все эти заголовки, но те, которые есть, мне нужно будет заменить, поэтому это выглядит так:

@Программа @RxBIN @RXPCN @RxGroup @MemberID

Заранее спасибо, Джо


person jmituzas    schedule 31.08.2010    source источник
comment
Я не совсем понимаю, какова ваша цель. Можете ли вы быть немного более конкретным?   -  person Nate    schedule 31.08.2010
comment
Джо, вы спросили то же самое на dostips.com/?t=Batch.FindAndReplace - и, кажется, там опубликовано отличное решение (это непросто, я бы использовал gVim, vim или специальное приложение для поиска/замены).   -  person Rudu    schedule 31.08.2010
comment
Я экспортировал из Excel в текст с разделителями (.txt) Первая строка файла .txt В первой строке есть все или некоторые из следующих элементов: Program RxBIN RXPCN RxGroup MemberID мне нужно сделать, чтобы они читались как: @ Program @RxBIN @RXPCN @RxGroup @MemberID Мне нужно найти из первой строки Program и заменить на @Program и так далее. Заранее спасибо, Джо   -  person jmituzas    schedule 31.08.2010
comment
@Rudi Я следил за этим по ссылке, которую вы разместили. В терминале он возвращает мне правильную замену, но вообще не записывает в файл.   -  person jmituzas    schedule 31.08.2010
comment
@Rudi Я заставил это работать правильно, но есть ли способ, чтобы он искал все термины Program RxBIN RXPCN RxGroup MemberID и заменял сразу? А не по одному?   -  person jmituzas    schedule 31.08.2010


Ответы (2)


Я бы по-прежнему был склонен использовать инструмент, созданный для этой цели: Batch Replacer кажется полностью соответствует счету.

Но если вы твердо настроены на это... что-нибудь с использованием старого repl.bat с парсером с несколькими аргументами... это становится чем-то вроде монстра при использовании DEBUG, но вот последний шедевр:

Исходный код: mmrepl.bat

@ECHO OFF
setLocal EnableDelayedExpansion

::: mmrepl - Replaces one or more strings with others, in file(s)
:::
::: syntax: mmrepl.bat $file $find $replace [$find $replace] ...
:::            $file    [in] - file to be parsed
:::            $find    [in] - string to find
:::            $replace [in] - string to replace with
:::
:::         * $find & $replace should be supplied in pairs, n multiples allowed
:::         * $file can be a single file (eg.txt) or a file filter (*.txt)
:::           you can supply any command that works with 'dir /b $file'
:::           so paths and drives are also valid.
:::         * $find,$replace strings can be single words, or strings enclosed
:::            in quotes (which will be stripped)
if "%~1"=="" findstr "^:::" "%~f0"&GOTO:EOF
if not exist %1 echo No files matching %1 found&GOTO:EOF

::Creates the following log file:
set log=%0.log
::Temporarily creates the following files but cleans up
set replscr=TEMPDEBUG.SCR
set cmplsrc=TEMPEDLN.SCR

echo To see the work of %0.bat view the log file %log%
echo Multi-Multi Replacement (%0.bat)>%log%
echo.>>%log%
set "files=%1"
shift
set mmreplcmd=
:: Pair up find/replaces
:strippairs
set p1=%1
set p1=!p1:"=!
set p2=%2
set p2=!p2:"=!
SET mmreplcmd=%mmreplcmd%'1R%p1%' 1A '%p2%' 0D 0A 
echo Replacing "%p1%" with "%p2%" >> %log%
shift
shift
if "%~1" neq "" goto:strippairs

::Build script
echo N%cmplsrc% > %replscr%
echo E CS:100 %mmreplcmd%'E' 0D 0A>> %replscr%
echo RCX >> %replscr%
echo 40 >> %replscr%
echo W >> %replscr%
echo Q >> %replscr%
DEBUG < %replscr% > NUL
::Execute on files
for /f %%a IN ('dir /b %files%') do (
  echo.>>%log%
  echo *** File: %%a >> %log%
  EDLIN %%a < %cmplsrc% >> %log%
)
DEL %replscr%
DEL %cmplsrc%

ПРИМЕЧАНИЕ: мне пришлось удалить "содержится" при поиске repl.bat, потому что вы добавляете амперсанд к каждому заголовку, поэтому он всегда содержит... мое тестирование показывает, что это работает нормально, но YMMV (тест).

person Rudu    schedule 02.09.2010

Это можно сделать тривиально с помощью sed (sпоток editor), который доступен для Windows в несколько места.

Это можно сделать с помощью чего-то вроде

sed -e "s/\(Program\|RxBIN\|RXPCN\|RxGroup\|MemberID\)/@\1/g" myfile.txt > newfile.txt

Это регулярное выражение, которое в основном говорит: «замените слово «Программа», или «RxBIN», или «RXPCN», или «RxGroup», или «MemberID», знак at и любое совпадающее слово».

Есть много замечательных команд Unix, которые были перенесены в Windows и могут быть чрезвычайно полезными.

person Stephen P    schedule 02.09.2010
comment
В таких случаях лучше всего подходят инструменты, разработанные для Unix, особенно если вы не хотите внедрять свои собственные с помощью Java или C#. - person Paul Gregoire; 03.09.2010