2016-02-13 2 views
2

Как вырезать строки, подобные этим, в моем .bat-файле, как только появится строка , TARO/?Как вырезать строку после определенного слова?

Init., 12, TARO/ BLA BLA CDE 
Ademanto, TARO/ BLA BLA XYZ 

Я только хочу, чтобы иметь Init., 12 и Ademanto впоследствии.

Я не могу использовать разделитель в FOR, поскольку он ограничен только одним символом, не так ли?

ответ

6

set способен вырезать от начала до определенной строки, но не от определенной строки до конца. Используя небольшой трюк помогает:

setlocal enabledelayedexpansion 
set "string=Init., 12, TARO/ BLA BLA CDE" 
set "str=%string:*TARO/=TARO/%" 
echo "!string:%str%=!" 

(заменить начало строки, включая разделитель-строки (*TARO/) с разделителем строки только (TARO/) На втором этапе, удалите найденную строку.)

другой путь заключается в замене разделительной строки на один разделитель символов (любой символ, который не обязательно должен находиться в строке.) (странный символ ниже (þ) является chr(127), но вы также можете использовать @, # или любой другой символ то есть не в вашей строке (-ях))

for /f "delims=þ" %%i in ("%string:TARO/=þ%") do echo %%i 
+0

как только вы замените '' string1' на string' в вашем 'echo' командной строки (ehich Я думаю, это просто опечатка), ваш ответ будет работать, если нет ядовитых символов, таких как' "' или ' = 'в исходной строке, и если она не начинается с' * 'или' ~ '... – aschipfl

6

Есть еще один способ. Заменить , TARO/ на &rem;.

@echo off 
setlocal 

set "str=Init., 12, TARO/ BLA BLA CDE" 
set str=%str:, TARO/=&rem;% 

echo %str% 

Это работает, потому что переменная расширяется перед командой set оценивается. Поэтому, когда линия оценивается, она оценивается как ...

set str=Init.,12&rem; BLAH BLAH CDE 

... в качестве составной команды set var=value & rem (rest of line ignored)

Вы могли бы также echo %str:, TARO/=&rem;% и добиться того же эффекта.

+2

Должна работать хорошо, пока строка не содержит символ цитаты или яда перед строкой отсечения, что, безусловно, верно для пример текста. – dbenham

5

Вот более надежное решение, которое должно работать, даже если строка содержит кавычки или символы яда - замените строку обрезки на новый символ строки. FOR/F будет перебирать каждую результирующую строку, поэтому используйте GOTO, чтобы выйти из цикла и сохранить только первую строку.

@echo off 
setlocal disableDelayedExpansion 
set "string=;Init., 12, TARO/ BLA BLA CDE" 
setlocal enableDelayedExpansion 
set ^"string=!string:, TARO/=^ 

!^" 
for /f delims^=^ eol^= %%A in ("!string!") do (
    endlocal 
    set "string=%%A" 
    goto :break 
) 
:break 
set string 
+0

Теперь это какая-то причудливая пакетная работа. – CoveGeek

+0

тоже для меня. Мне этого не хватает. – mifu

Смежные вопросы