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
)非常感谢您提供此答案以及解释问题的注释-非常有用!非常感谢您提供此答案以及解释问题的注释-非常有用!