【问题标题】:How to use regex in cmd findstr? (Regex not working)如何在 cmd findstr 中使用正则表达式? (正则表达式不起作用)
【发布时间】:2020-11-15 03:43:41
【问题描述】:

我只是看到一些正则表达式无法在 windows cmd 中运行,因为它不支持所有正则表达式命令。我为我的problem 找到了一个正则表达式。

所以现在我需要使用 findstr 和这个正则表达式:(?si)(?:^(?<!.)|\R{2}|^Account:(?-s:.*)\R)\K(?:(?!\R{2}).)*?(?-s:\bfifa\b.*\b20\b).*?(?=\R{2}|\z),但 windows 命令行找不到这个,实际上跳过了。

  1. 如何使用上述正则表达式,从一个 txt 文件中查找所有匹配项并将它们输出到批处理文件中的另一个 txt 文件?

这就是我过去使用其他简单正则表达式的方式,但现在无法正常工作:

type %LogFILE% | findstr /i /r /c:"(?si)(?:^(?<!.)|\R{2}|^Account:(?-s:.*)\R)\K(?:(?!\R{2}).)*?(?-s:\bfifa\b.*\b20\b).*?(?=\R{2}|\z)" > %LogNEW%
  1. 我们可以在cmd中使用powershell命令吗?我尝试这样做,但它关闭了我的批处理命令(我不知道这种语法是否正确):
powershell -command "& {Get-ChildItem -Path .\LogFILE.txt -r | Select-String "(?si)(?:^(?<!.)|\R{2}|^Account:(?-s:.*)\R)\K(?:(?!\R{2}).)*?(?-s:\bfifa\b.*\b20\b).*?(?=\R{2}|\z)" > LogNEW.txt}"

已编辑:我想从 txt 文件中选择包括 fifa(作为字符串而不是单个单词)的匹配,并将它们输出到另一个 txt 文件(1 和 2 模式的单独解决方案):

模式 1 已解决: powershell -command "&amp; {Get-ChildItem .\LogFILE.txt -r | Get-Content -Raw | Foreach-Object { $_ -Split '(\r?\n)(?=(\r?\n)+)' } | Select-String 'fifa'} | Out-File -encoding Default LogNEW.txt"

1:

Region: AR
OnlineID: Atl_Tuc
---Start---
FIFA 18 Legacy Edition
---END---

Region: FR
OnlineID: jubtrrzz
---Start---
FIFA 19
Undertale
Pro Evolution Soccer™ 2018
---END---

Region: US
OnlineID: Cu128yi
---Start---
KINGDOM HEARTS HD 1.5 +2.5 ReMIX
---END---

Region: RO
OnlineID: Se116
---Start---
Real Farm
EA SPORTS™ FIFA 20
LittleBigPlanet™ 3
---END---

Region: US
OnlineID: CAJ5Y
---Start---
Madden NFL 18: G.O.A.T. Super Bowl Edition
---END---

模式 2 已解决:powershell -command "&amp; {Get-ChildItem .\LogFILE.txt -r | Get-Content -Raw | Foreach-Object { $_ -Split '(?&lt;=---END---\s*\n)\s*\n' } | Select-String 'fifa'} | Out-File -encoding Default LogNEW.txt"

2:

Language: pt-BR (Actually I need [Language:.*])

Region: AR
OnlineID: Atl_Tuc
---Start---
FIFA 18 Legacy Edition
---END---

Language: en-US

Region: FR
OnlineID: jubtrrzz
---Start---
FIFA 19
Undertale
Pro Evolution Soccer™ 2018
---END---

Language: en-GB

Region: US
OnlineID: Cu128yi
---Start---
KINGDOM HEARTS HD 1.5 +2.5 ReMIX
---END---

Language: pt-BR

Region: RO
OnlineID: Se116
---Start---
Real Farm
EA SPORTS™ FIFA 20
LittleBigPlanet™ 3
---END---

Language: es-MX

Region: US
OnlineID: CAJ5Y
---Start---
Madden NFL 18: G.O.A.T. Super Bowl Edition
---END---

【问题讨论】:

  • 好吧,findstr 只支持一小部分正则表达式,没有分组 ((/)/?/:),没有量词 (+/@ 987654338@/}/?) 除了*,没有改动(|) 等等……
  • 你为什么使用findstr.exe - 一个命令行实用程序 - 而不是Select-String - 一个 PoSh cmdlet?
  • 利用 PowerShell,因为您已经尝试过;不过,我无法帮助您解决语法……
  • 我想我们在这里处理一个XY Problem。为什么你如此渴望使用旧时尚和有限的CMDfindstr
  • @morez890 - 很高兴知道你已经成功了。我的问题在于您的原始陈述 - cmd.exepowershell.exe - 并且已经解决。感谢您的反馈! [咧嘴]

标签: regex powershell batch-file cmd command-line


【解决方案1】:

根据评论,这听起来像是XY Problem;您非常渴望以自己的方式解决此问题(尝试在旧式 CMD 中使用单个正则表达式和有限的 FindStr 命令),以至于您可能会失去更广泛的图景以及任何其他尝试的解决方案。

例如:

PowerShell

Get-ChildItem .\LogFILE.txt -r |
    Get-Content -Raw | Foreach-Object {
        $_ -Split '(?<=---END---\s*\n)\s*\n' # or: '(?<=Language:[\S\s]*\n)\s*\n'
    } | Select-String 'fifa'

将其放入 CMD 命令中:

powershell -command "& {Get-ChildItem .\LogFILE.txt -r | Get-Content -Raw | Foreach-Object { $_ -Split '(?<=---END---\s*\n)\s*\n' } | Select-String 'fifa'} > LogNEW.txt"

【讨论】:

  • 是的,我认为使用该正则表达式是解决此问题的最简单方法,这就是我跳过主要问题的原因。您的回答有效,非常感谢。但在某些情况下,我有一个字符串,例如:“开始 + 一行文字 + 一个空行 + 我的主要选择 + 选择结束”,就像这样 demo (但这个正则表达式需要稍微改变一下:@987654329 @ 进行我提到的选择。)那么如何处理 { $_ -Split '(\r?\n)(?=(\r?\n)+)' } 呢?
  • 如果还能帮助我执行另一个命令,我将不胜感激。我需要计算每个包含 fifa 的字符串(命中)并将其放入另一个 var 并在 cmd 中使用它。我现在正在使用这个命令:for /f %%N in ('findstr /i /r /c:"FIFA.*20" ^&lt; %LogFILE%') do set /a count+=1 if !count! lss 10 set "count=0%count%" if !count! lss 10 set "count=%count:~-2% if !count! gtr 0 echo !count! X Hit With FIFA&gt;&gt; %LogNEW% set count=0
  • 请为此创建一个新问题,并找到为什么要为此使用生锈的 CMD 提示符。 PowerShell 的语义更好,限制更少。
  • 为什么是因为我有一个用 cmd 编写的半大应用程序,如果我想将其转换为 PS,我应该更改每一行,我对它的脚本知之甚少。感谢您的解决方案
猜你喜欢
  • 2020-07-08
  • 2015-06-19
  • 1970-01-01
  • 2018-03-21
  • 1970-01-01
  • 2020-09-14
相关资源
最近更新 更多