CMD скрипт для поиска и замены части найденной строки в файле - PullRequest
1 голос
/ 31 января 2012

Мне нужно найти все строки в myfile.txt, содержащие слово «MyWord», а затем заменить часть этой строки следующим образом:

Исходная строка:

 ...,31-01-2012,00,some_words_and_symbols_and_digits,MyWord,...

После замены:

 ...,31-01-2012,01,some_words_and_symbols_and_digits,MyWord,...

Пожалуйста, помогите мне написать этот cmd скрипт!

ОК .. У меня есть следующий код:

@echo off
set code=MyWord
set req=new request

FOR /F "usebackq delims=, tokens=1,2,3,4,5,6,7,8,9*" %%a in (MyFile.txt) do (

IF %%h==%code% (
    SET tempstr=%%a,%%b,%%c,%%d,60,%%f,%%g,%%h,%%i
    ) ELSE (
    SET tempstr=%%a,%%b,%%c,%%d,%%e,%%f,%%g,%%h,%%i
    ) 

IF %%a==%req% (
    SET echo %%a >> new.strings
    ) ELSE (
    echo %tempstr% >> new.strings
    )

)
@echo on

А у меня в файле что-то вроде:

 new request
 ...,31-01-2012,01,some_words_and_symbols_and_digits,MyWord,...
 new request
 ...,30-11-2011,01,some_words_and_symbols_and_digits,OtherWords,...

Но тогда у меня ошибка:

ELSE was unexpected at this time.

И если я попытаюсь просто следующий в конце

IF %%a==%req% SET tempstr=%%a
echo %tempstr% >> new.strings

Тогда у меня есть только один последний ряд вместо другого

1 Ответ

1 голос
/ 31 января 2012

Вы можете использовать команду find для фильтрации строк, содержащих данный текст. Как я вижу, файл CSV. Таким образом, вы можете использовать for /f для анализа найденных строк. Затем вы можете echo все проанализированные файлы, заменив нужное поле.

Это заменит все значения в 3-м столбце на «01»

@echo off
for /f "usebackq delims=, tokens=1,2,3,4,<put as many as you need>" %%A in (`find "MyWord" myfile.txt`) do echo %%A,%%B,01,%%D,<as many %%letters as tokens>

Если вы хотите заменить значение только в некоторых строках, вы можете использовать команду if внутри цикла for /f.

==== РЕДАКТИРОВАТЬ

Проблема со значением переменной req. Он содержит пробел, поэтому после подстановки ваш второй оператор if имеет следующий вид:

IF %%a==new request (

, поэтому, если %%a равно new, будет выполнено request ( echo ...... ), и тогда ELSE будет действительно неожиданным. Заключите в кавычки и %%a, и %req%, и проблема исчезнет.

Но я вижу и другие проблемы. Во-первых, у вас есть избыточный set в вашем втором операторе if. Во-вторых, вам нужно использовать отложенное расширение переменных, иначе ваш echo %tempstr% не будет работать.

Ваш код после необходимых изменений:

@Echo off
setlocal enabledelayedexpansion

set code=MyWord
set req=new request

FOR /F "usebackq delims=, tokens=1,2,3,4,5,6,7,8,9*" %%a in (MyFile.txt) do (

  IF %%h==%code% (
    SET tempstr=%%a,%%b,%%c,%%d,60,%%f,%%g,%%h,%%i
  ) ELSE (
    SET tempstr=%%a,%%b,%%c,%%d,%%e,%%f,%%g,%%h,%%i
  ) 

  IF "%%a"=="%req%" (
    echo %%a >> new.strings
  ) ELSE (
    echo !tempstr! >> new.strings
  )
)

endlocal
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...