繁体   English   中英

批处理 - 获取两个字符串之间的内容

Batch - get content between two strings

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我有这样的字符串

 <AdaptationSet maxHeight="576" maxWidth="1024" mimeType="video/mp4" id="0" segmentAlignment="true" startWithSAP="1">
  <ContentProtection schemeIdUri="urn:uuid:edef8ba9-79d6-4ace-a3c8-27dcd51d21ed" cenc:default_KID="bcf950eb-a062-5b0d-b1f2-fed53f20ba10">
    <cenc:pssh>AAAATHBzc2gAAAAA7e+LqXnWSs6jyCfc1R0h7QAAACwiJGFlNWU5NTk4LWU5ODktNWM1Ny1iOTk2LTg3OTA4NWIyYzUxNUjj3JWbBg==</cenc:pssh>
  </ContentProtection>
  <ContentProtection schemeIdUri="urn:mpeg:dash:mp4protection:2011" value="cenc" cenc:default_KID="bcf950eb-a062-5b0d-b1f2-fed53f20ba10" />
  <SegmentTemplate duration="6000" initialization="$RepresentationID$/video/init.mp4" media="$RepresentationID$_184201/segment_$Number$.m4s" startNumber="0" timescale="1000" />
  <Representation bandwidth="247600" codecs="avc1.64001F" height="144" width="256" id="ae5e9598-e989-5c57-b996-879085b2c515-0_video_frag_auto.idx~video_frag_auto~481" scanType="progressive" />

我想获得如下输出并将其放入变量中。

ae5e9598-e989-5c57-b996-879085b2c515

请注意,第一行中已经有id="0" ,我想为最后一行提取部分 id 值。 有没有一种简单的方法可以批量执行此操作?

4 个回复

如果您必须使用批处理,这里是一个入门示例。 这将从包含您的字符串的文件 ooo.txt 中提取所有值 id。

@echo off
setlocal enabledelayedexpansion
set x=0
for /f "eol=> tokens=* usebackq delims= " %%i in (`type ooo.txt`) do (
  set x=0
  set XXX=XXX
  for %%I in (%%i) do (
    if "%%I"=="id" (
      set x=1
    ) else (
      if !x! EQU 1 (
        set x=0
        set XXX=%%I
      )
    )
  )
  set XXX=!XXX:"=!
  if not "!XXX!"=="XXX" (
    set XXX=!XXX:"=!
    rem echo !XXX!
    call :enumerate !XXX! YYY
    echo !YYY!
  )
)

goto :eof

:enumerate
set pos=0
set Y=%1
set result=
set part=
:countchar
if not "!Y:~%pos%,1!"=="" (
  set /a pos=pos+1
  if "!Y:~%pos%,1!"=="-" (
    set result=!result!!part!
    set part=
  )
  set part=!part!!Y:~%pos%,1!
  goto :countchar
)
set %~2=!result!
exit/b
:eof
endlocal

这输出

ae5e9598-e989-5c57-b996-879085b2c515

并且,在循环中,将每个 id 存储在变量YYY (尽管第一个是空的)。

这假设您希望保留所有内容,但不包括最后一个连字符-

这是一个“有趣”示例,由于您自己没有提供任何代码,因此不会在回答后修改,也不会进行任何支持或解释。

@For /F Delims^= %%G In ('%__AppDir__%findstr.exe /i "id=\"[a-e0123456789]*-[a-e0123456789]*-[a-e0123456789]*-[a-e0123456789]*-[a-e0123456789]*-" "xmlfile.mpd"'
) Do @Set "}=%%G" & SetLocal EnableDelayedExpansion & For /F UseBackTokens^=2-6Delims^=-^" %%H In ('!}:* id^=^"^=!') Do @Endlocal & Set "id=%%H-%%I-%%J-%%K-%%L"
@(Set id) 2>NUL & Pause

您可能希望更改xmlfile.mpd的源文件名,并且可以选择删除最后一行,它被包含在内只是为了让您看看它是否有效!

@ECHO OFF
SETLOCAL
rem The following settings for the source directory, destination directory, target directory,
rem batch directory, filenames, output filename and temporary filename [if shown] are names
rem that I use for testing and deliberately include names which include spaces to make sure
rem that the process works using such names. These will need to be changed to suit your situation.

SET "sourcedir=u:\your files"
SET "filename1=%sourcedir%\q65892027.txt"

SET "capture="
SET "captured="

FOR /f "usebackqdelims=" %%b IN ("%filename1%") DO (
 FOR %%c IN (%%b) DO (
  IF /i "%%~c"=="scantype" SET "capture="&IF DEFINED captured GOTO done
  IF DEFINED capture SET "captured=%%~c"
  IF /i "%%~c"=="id" SET "capture=Y"
 )
)
:done
ECHO captured "%captured%"
GOTO :EOF
setlocal enabledelayedexpansion
echo:
set "td=%~dp0"
set "pattern= id="
set "id=id"
call:getPatternLength "!id!" plen
set /a "slen=!plen!-1"
set "opt=tokens=1,2,* delims=<"
for /f "tokens=* delims=" %%z in (' type "!td!usedata\id.txt"^| findstr /c:"!pattern!" ') do (
   for /f "%opt%" %%b in ("%%z") do (
      for /f "tokens=* delims=" %%y in ('echo/%%b^|findstr /v [0-9][a-z]') do (
         set "bempty=true"
         call:findit "%%c" "!id!" strfound
      )
      if not defined bempty call:findit "%%b" "!id!" strfound
      set "strfound=!strfound:"=!"
      if defined strfound (
         call:handlefound "!strfound!" result
         if defined result (echo Finally: !result! & exit /b 0)
      )
   )
)

:end
endlocal
exit /b 0



:getPatternLength
set "str=%~1"
set /a "count=0"
:next
for /f "tokens=* delims=" %%z in ('echo/!str!') do (
   set /a "count+=1"
   set "str=!str:~1!"
   if not "!str!"=="" goto:next
)
set "%2=!count!"
if /i "%0"==":getPatternLength" (exit /b 0)


:handlefound
set "str=%~1"
for /f "tokens=* delims=" %%a in ('echo/!str!^| findstr [a-z]') do (
   :notyet
   for /f "tokens=1,2,* delims=-" %%d in ("!str!") do (
      for /f "tokens=* delims=" %%g in ('echo/%%e^|findstr "_"') do (
         set "res=!res!-%%d"
         set "%2=!res!"
         exit /b 0
      )
      if not defined res ( set "res=%%d" ) else ( set "res=!res!-%%d")
      set "str=%%e-%%f" & goto:notyet
   )
)
echo Not the right line.. next.
exit /b 1


:findit
set "str=%~1"
set "find=%~2"
set "opts=tokens=1,* delims= "
set "opts2=tokens=1,* delims=="

:nexttoken
for /f "%opts%" %%m in ("!str!") do (
   for /f "%opts2%" %%o in ("%%m") do (
      if "%%o"=="!find!" (
         set "%3=%%p"
         if "%0"==":findit" exit /b 0
      )
      set "str=%%n" & goto:nexttoken
   )
)
exit /b 1
1 获取两个字符串之间的内容PHP

什么是获取两个字符串之间内容的最佳方法,例如 由于某种原因,这似乎在我的代码中的一个地方起作用,而不是另一个地方。 我会以正确的方式解决这个问题吗? 或者,还有更好的方法? 输出缓冲区也是这样做的方法还是file_get_contents? 提前致谢! ...

2 如何获取两个字符串之间的中间内容? [重复]

这个问题已经在这里有了答案: Python使用多字符分隔符分割字符串 3个答案 我需要在两个字符串分隔符之间使用中间内容,事实是我在整个字符串中具有三个打印的分隔符,我需要使用第二个分隔符并将其中间内容移向最后一个分隔符。 这是示例: 正确的输出必须是 ...

3 在VBA Excel中获取两个字符串之间的内容

我正在编写一个宏,但遇到以下问题: 我有一个标准化的表-&gt;请查看附件 由于### START和### END之间的数据可能会发生变化,我想编写一个始终在### START和### END的内容之间查找的宏,并复制动作类型为字词的完整行放入一张新纸上。 由于不熟悉VBA,我不 ...

4 使用regexp_substr获取两个字符串之间的所有内容

我想编写一个查询,以获取两个字符串之间的所有内容,例如,获取所有utm_source和“&”符号之间的内容。 这是我尝试过的: 但是,这是无效的语法 这是我尝试提取的样本 我也尝试过 但这返回此: 我也使用split_part: 问题在于这会同时返 ...

6 在两个字符串(包括字符串)之间提取内容

我正在尝试在python中执行以下操作。 我有以下内容的文件... 我想将这些虚拟主机容器中的每个容器放置在单独的文件(或变量中,然后我可以从那里工作)... 我已经能够在字符串之间获取数据,但不包括它们。 所以输出将是... 请让我知道这是否可以轻松完成。 谢谢 ...

8 批处理脚本_比较两个字符串变量

我试图比较来自用户输入("yes") 和预定义("yes") 值的一个变量。 但是,当我运行 .bat 文件时,cmd 会给我语法错误消息。 请帮助我如何比较 if 语句中的两个字符串值。 谢谢。 这是代码: 输出:命令的语法不正确。 ...

9 在批处理中寻找两个字符串作为文件名

这应该很简单..但是,我不明白.. 因此,我要查找的是文件名中包含sams或tims的所有文件,但忽略该文件夹中的任何其他文件。 而且,是的,我知道我可以执行以下操作。 但我还有其他文件名要比较。 我还考虑过比较部分字符串,但似乎也不起作用。是的,它似乎只能单独使用s ...

10 如何编写批处理文件以将两个字符串与if语句进行比较?

我刚刚开始在python中编程。 我在Sublime文本中编写代码,然后使用cmd通过python 3.7解释器解释。 我发现很难总是指定保存我的python代码的目录,所以我使用了批处理文件的帮助并创建了一个代码,但我不能用if语句比较两个字符串,其中一个是输入字符串。 我不能去里 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM