Windows 复制findstr结果后的行

Windows 复制findstr结果后的行,windows,cmd,batch-file,Windows,Cmd,Batch File,我有一个包含以下内容的文件: <key>CFBundleName</key> <string>${PRODUCT_NAME}</string> <key>CFBundlePackageType</key> <string>APPL</string> <key>CFBundleShortVersionString</key> <string>8.10</stri

我有一个包含以下内容的文件:

<key>CFBundleName</key>
<string>${PRODUCT_NAME}</string>
<key>CFBundlePackageType</key>
<string>APPL</string>
<key>CFBundleShortVersionString</key>
<string>8.10</string>
<key>CFBundleURLTypes</key>
输出

<key>CFBundleShortVersionString</key>
CbundleShortVersionString
但是我该如何提取下面的行呢?i、 e

<string>8.10</string>
8.10
我正在Windows 10中使用命令提示符

谢谢,
克里斯。

如果你只需要这两行,我们就用这个技巧吧

您可以将其粘贴到CLI中:

SET "_Found="
@for /f "delims=," %a in ('
    Type "Info.pList"
  ') do @(
  IF  NOT DEFINED _Found (
    ECHO=%a|find "CFBundleShortVersionString" && (
      SET "_Found=1"
    )
  )  ELSE (
    ECHO=%a
    SET "_Found="
  )
)>> "CFBundleShortVersionString.txt"

这将输出每个匹配和每个匹配后的第一行

如果您只需要这两行,我们就使用这个技巧

您可以将其粘贴到CLI中:

SET "_Found="
@for /f "delims=," %a in ('
    Type "Info.pList"
  ') do @(
  IF  NOT DEFINED _Found (
    ECHO=%a|find "CFBundleShortVersionString" && (
      SET "_Found=1"
    )
  )  ELSE (
    ECHO=%a
    SET "_Found="
  )
)>> "CFBundleShortVersionString.txt"

这将输出每个匹配项和每个匹配项后的第一行。您可以首先确定包含搜索字符串的行数,然后读取文件并跳过该行数,如下所示:

@echo关闭
setlocal EnableExtensions DisableDelayedExpansion
rem//初始化变量:
设置“LineNumber=”&set“LineString=”
rem//让'findstr'在匹配行前面加上一个冒号:
对于/F“delims=:”%%L in('findstr/N“CbundleShortVersionString”“Info.pList“'),请执行以下操作(
rem//获取行号(如果要最后匹配,请删除“如果已定义行号”):
如果未定义行号集/A“行号=%%L”
)
rem//检查是否已找到搜索字符串:
如果定义了行号(
rem//读取文件,但跳过包含搜索字符串的行:
对于/F“usebackq skip=%LineNumber%delims=“%%S in”(“Info.pList”)do(
rem//这将捕获包含搜索字符串的行之后的下一行(非空):
如果未定义LineString,请设置“LineString=%%S”
)
)
rem//返回结果:
echo这是提取的行:“%LineString%”
端部
退出/B

您可以先确定包含搜索字符串的行数,然后读取文件并跳过该行数,如下所示:

@echo关闭
setlocal EnableExtensions DisableDelayedExpansion
rem//初始化变量:
设置“LineNumber=”&set“LineString=”
rem//让'findstr'在匹配行前面加上一个冒号:
对于/F“delims=:”%%L in('findstr/N“CbundleShortVersionString”“Info.pList“'),请执行以下操作(
rem//获取行号(如果要最后匹配,请删除“如果已定义行号”):
如果未定义行号集/A“行号=%%L”
)
rem//检查是否已找到搜索字符串:
如果定义了行号(
rem//读取文件,但跳过包含搜索字符串的行:
对于/F“usebackq skip=%LineNumber%delims=“%%S in”(“Info.pList”)do(
rem//这将捕获包含搜索字符串的行之后的下一行(非空):
如果未定义LineString,请设置“LineString=%%S”
)
)
rem//返回结果:
echo这是提取的行:“%LineString%”
端部
退出/B

这里有一种使用正则表达式获取下一行的方法。选择字符串不是sed或awk,但它可以做一些事情

FOR /F "delims=" %%A IN ('powershell -NoLogo -NoProfile -Command ^
    "(Get-Content -Path C:\src\t\Get-NextLine.txt -Raw |" ^
        "Select-String -Pattern 'CFBundleShortVersionString.*\n(.*)\n').Matches.Groups[1].Value"') DO (
            SET "NEXT_LINE=%%~A"
    )
ECHO NEXT_LINE is "%NEXT_LINE%"
如果目标是从行中获得
8.10
,那么在-Pattern上多做一些工作就可以做到这一点


注意:如果使用了
ECHO%NEXT\u LINE%
,将解释重定向字符
。这就是最后一行使用引号字符的原因。

这里有一种使用正则表达式获取下一行的方法。选择字符串不是sed或awk,但它可以做一些事情

FOR /F "delims=" %%A IN ('powershell -NoLogo -NoProfile -Command ^
    "(Get-Content -Path C:\src\t\Get-NextLine.txt -Raw |" ^
        "Select-String -Pattern 'CFBundleShortVersionString.*\n(.*)\n').Matches.Groups[1].Value"') DO (
            SET "NEXT_LINE=%%~A"
    )
ECHO NEXT_LINE is "%NEXT_LINE%"
如果目标是从行中获得
8.10
,那么在-Pattern上多做一些工作就可以做到这一点


注意:如果使用了
ECHO%NEXT\u LINE%
,将解释重定向字符
。这就是最后一个输出行使用引号字符的原因。

这是文件中唯一一个带有数字(
x.xx
)的
..
行吗?这是文件中唯一一个带有数字(
x.xx
)的
行吗?和
ECHO=%a |查找“CbundleShortVersionString”>nul&&(
抑制匹配行的输出并仅显示其后面的行。(注意:在批处理文件中使用时,将每个
%a
替换为
%a
)和
ECHO=%a | find“CFBundleShortVersionString”>nul&(
抑制匹配行的输出并仅显示其后面的行)。(请注意:在批处理文件中使用时,请将每个
%a
替换为
%a
)非常感谢您提供此答案以及解释问题的注释-非常有用!非常感谢您提供此答案以及解释问题的注释-非常有用!