разделить строку со строкой в качестве разделителя

<p>я пытаюсь разбить строку в командном файле, используя строку (а не символ) в качестве разделителя.</p><p>строка имеет формат:</p><pre><code>string1 by string2.txt </code></pre><p>разделителем является <code>by</code> (да, пробел, слово «мимо», затем пробел). я хочу получить вывод:</p><pre><code>string1 string2 </code></pre><p>таким образом, в основном, разделите строку на 2 части разделителем <code>by</code> и удалите суффикс из второй строки. как я могу это сделать?</p>

<p>попробуй это:</p><pre><code>for /f "tokens=1,3 delims=. " %%a in ("%string%") do ( echo %%a echo %%b ) </code></pre><p>то есть взять первый и третий токены, разделенные пробелом или точкой ...</p>

<p>недавно я обнаружил интересную уловку, которая позволяет «разделять строку с помощью строки в качестве разделителя», поэтому я не мог удержаться от соблазна выложить ее здесь в качестве нового ответа. обратите внимание, что <em>"очевидно, вопрос не был точным. во-первых, и string1, и string2 могут содержать пробелы. во-вторых, и string1, и string2 могут содержать амперсанды ('&')"</em>. этот метод корректно работает с <em>новыми спецификациями</em> (публикуется как комментарий под ответом стефана).</p><pre><code>@echo off setlocal set "str=string1&with spaces by string2&with spaces.txt" set "string1=%str: by =" & set "string2=%" set "string2=%string2:.txt=%" echo "%string1%" echo "%string2%" </code></pre><p>для получения дополнительной информации о методе разбиения см. <a href="http://www.dostips.com/forum/viewtopic.php?f=3&t=6429">этот пост</a> .</p>

<pre class="lang-dos prettyprint-override"><code>@echo off setlocal set "string=string1 by string2.txt" set "string=%string:* by =%" echo +%string%+ goto :eof </code></pre><p>приведенная выше команда set удалит нежелательные данные. результат показан между +, чтобы продемонстрировать отсутствие пробелов.</p><p>формула: set var =% somevar: * string1 = string2%</p><p>присваивает переменной var значение somevar, в котором все символы вплоть до строки1 заменяются на строку2. заключенные в команду set кавычки гарантируют, что любые произвольные конечные пробелы в строке не будут включены в назначенное значение.</p>

<p>я расширил ответ magoos, чтобы получить обе желаемые строки:</p><pre><code>@echo off setlocal enabledelayedexpansion set "string=string1 by string2.txt" set "s2=%string:* by =%" set "s1=!string: by %s2%=!" set "s2=%s2:.txt=%" echo +%s1%+%s2%+ </code></pre><p>правка: просто чтобы доказать, мое решение также работает с дополнительными требованиями:</p><pre><code>@echo off setlocal enabledelayedexpansion set "string=string&1 more words by string&2 with spaces.txt" set "s2=%string:* by =%" set "s1=!string: by %s2%=!" set "s2=%s2:.txt=%" echo "+%s1%+%s2%+" set s1 set s2 </code></pre><p>результат:</p><pre><code>"+string&1 more words+string&2 with spaces+" s1=string&1 more words s2=string&2 with spaces </code></pre>

<p>я нашел два старых сценария, которые используют неопределенную или даже определенную строку для разделения .... в качестве подхода они всегда полезны.</p><p> <a href="https://www.administrator.de/contentid/226533#comment-1059704">https://www.administrator.de/contentid/226533#comment-1059704</a> <a href="https://www.administrator.de/contentid/267522#comment-1000886">https://www.administrator.de/contentid/267522#comment-1000886</a> </p><pre><code>@echo off :nooption if "%~1" neq "" goto :nohelp echo gibt eine ausgabe bis zur angebenen zeichenfolge&echo( echo %~n0 ist mit eingabeumleitung zu nutzen echo %~n0 "zeichenfolge" ^<quelldatei [^>zieldatei]&echo( echo zeichenfolge die zu suchende zeichenfolge wird mit find bestimmt echo ohne ausgabeumleitung ausgabe im cmd fenster exit /b :nohelp setlocal disabledelayedexpansion set "intemp=%temp%%time::=%" set "string=%~1" set "stringlength=0" :laenge string bestimmen for /f eol^=^ ^ delims^= %%i in (' cmd /u /von /c "echo(!string!"^|find /v "" ') do set /a stringlength += 1 :eingabe temporär speichern >"%intemp%" find /n /v "" :suchen der zeichenfolge und zeile bestimmen und speichen set "nrout=" for /f "tokens=*delims=" %%a in (' find "%string%"^<"%intemp%" ') do if not defined nrout (set "linestr=%%a" for /f "delims=[]" %%b in ("%%a") do set "nrout=%%b" ) if not defined nrout >&2 echo zeichenfolge nicht gefunden.& set /a xcode=1 &goto :end if %nrout% gtr 1 call :line call :linestr :end del "%intemp%" exit /b %xcode% :linestr suche nur jeden ersten buchstaben des strings in der treffer-zeile dann ausgabe bis dahin for /f eol^=^ ^ delims^= %%a in ('cmd /u /von /c "echo(!string!"^|findstr .') do ( for /f "delims=[]" %%i in (' cmd /u /von /c "echo(!linestr!"^|find /n "%%a" ') do ( setlocal enabledelayedexpansion for /f %%n in ('set /a %%i-1') do if !linestr:^~%%n^,%stringlength%! equ !string! ( set "lineout=!linestr:~0,%%n!!string!" echo(!lineout:*]=! exit /b ) ) ) exit /b :line vorige zeilen ausgeben for /f "usebackq tokens=* delims=" %%i in ("%intemp%") do ( for /f "tokens=1*delims=[]" %%n in ("%%i") do if %%n equ %nrout% exit /b set "line=%%i" setlocal enabledelayedexpansion echo(!line:*]=! endlocal ) exit /b </code></pre><hr><pre><code>@echo off :: cutwithwildcards.cmd :nooption if "%~1" neq "" goto :nohelp echo gibt eine ausgabe ohne die angebene zeichenfolge. echo der rest wird abgeschnitten.&echo( echo %~n0 "zeichenfolge" b n e [/i] &echo( echo zeichenfolge string zum durchsuchen echo b zeichen wonach am anfang gesucht wird echo n auszulassende zeichenanzahl echo e zeichen was das ende der zeichen bestimmt echo /i case intensive exit /b :nohelp setlocal disabledelayedexpansion set "original=%~1" set "begin=%~2" set /a excl=%~3 ||echo syntaxfehler.>&2 &&exit /b 1 set "end=%~4" if not defined end echo syntaxfehler.>&2 &exit /b 1 set "caseint=%~5" :: end setting input param set "out=" set "more=" call :read original if errorlevel 1 echo zeichenfolge nicht gefunden.>&2 exit /b :read varname b # e [/i] for /f "delims=[]" %%a in (' cmd /u /von /c "echo !%~1!"^|find /n %caseint% "%begin%" ') do ( if defined out exit /b 0 for /f "delims=[]" %%b in (' cmd /u /von /c "echo !%1!"^|more +%excl%^|find /n %caseint% "%end%"^|find "[%%a]" ') do ( set "out=1" setlocal enabledelayedexpansion set "in= !original!" set "in=!in:~,%%a!" echo !in:^~2! endlocal ) ) if not defined out exit /b 1 exit /b ::oneliner for cmdline set "dq="" for %i in ("*s??e*") do @set "out=1" &for /f "delims=[]" %a in ('cmd/u/c "echo %i"^|find /n "s"') do @if defined out for /f "delims=[]" %b in ('cmd/u/c "echo %i"^|more +2^|find /n "e"^|find "[%a]"') do @if %a equ %b set "out=" & set in= "%i" &cmd /v/c echo ren "%i" !in:^~0^,%a!!dq!) </code></pre>