【问题标题】:Powershell: Search for string at end of one line and beginning of next line, and output line numberPowershell:在一行末尾和下一行开头搜索字符串,并输出行号
【发布时间】:2020-03-20 22:54:03
【问题描述】:

如何搜索以查找只有 ~“波浪号”字符的行,然后是不以 ~ 波浪号开头的下一行。

这适用于大型多记录文本文件,通常每个多记录都由仅带有 ~ 波浪号字符的记录分隔(分隔)。我想在文件中找到所有缺少的分隔符。文件中的所有记录都以 CRLF 结尾。

要搜索的示例文本文件。在这个示例文件中,第一个多记录位于第 1 行和第 2 行,然后是波浪号 ~ 分隔符,然后第 4 到 6 行是下一个多记录,然后是第 7 行的另一个 ~ 分隔符。 脚本应该在第 8 行找到错误,因为它应该以 ~ 开头,后跟更多文本(如第 1 行和第 4 行)。

MyTextFile.txt

~A123~,~800-123-1234~,~800-345-6789~

SAMPLE TEXT HERE

~

~A100~,~800-123-1234~,~800-345-6789~

SAMPLE TEXT HERE

MORE SAMPLE TEXT HERE

~

SAMPLE TEXT HERE

MORE SAMPLE TEXT HERE

以下 PowerShell 代码在下一行“S”中仅使用波浪号后跟第一个字符来查找“值”,但它没有显示行号,我需要这样我可以删除后面的剩余文本~ 线。

当前代码:

$MYFILE = Get-Content MyTextFile.txt -Raw
[regex]$rx="[~]`r`n[^~]"
$rx.Match($MYFILE) 

输出:

Groups   : {0}
Success  : True
Name     : 0
Captures : {0}
Index    : 136
Length   : 4
Value    : ~
           S

我在 Linux BASH 中有一个工作脚本,但我是 Powershell 新手。

【问题讨论】:

  • 我相信你要求'(?m)^~\r?\n(?!~)',但事实上,如果你想替换的不仅仅是这个匹配,你还需要其他东西。您的预期输出是什么?
  • 它可以是找到值“S”的整行和行号。所以在我的示例文本文件中,它应该输出“SAMPLE TEXT HERE”行和第 8 行的行号。它不必替换任何内容。只需输出匹配的 REGEX 的行和行号即可。
  • 不能输出行号,99.9%的情况下不需要。要匹配~ 行之后的行,您可以使用'(?m)(?<=^~\r?\n)[^~].*'
  • 谢谢。最后一个代码现在匹配并返回整行。也许我可以创建一个计数器来查找匹配的行号?
  • 正则表达式不可能,它不知道任何行。

标签: regex powershell


【解决方案1】:

您可以为此使用Select-String

Select-String -Path MyTextFile.txt -Pattern '^~$' -Context 1 | Foreach-Object {
    if ($_.Context.Postcontext -notmatch '^~') {
        throw "Error: Line $($_.LineNumber+1) is missing the delimiter"
    }
}

说明:

Select-String 可以使用-Path 命令逐行读取文本文件,并根据-Pattern 值执行正则表达式匹配。使用 -Context 1 返回每​​个匹配项的上方和下方的行。

返回的对象是一个MatchInfo 对象,其属性为LineNumber(用于匹配的行)和ContextContext 是一个 MatchInfoContext 对象,具有 PreContext(匹配前行)和 PostContext(匹配后行)属性。

【讨论】:

  • 谢谢 AdminOfThings。你的解释现在对我来说更有意义了。这现在正在为需要的东西工作。我对你的代码做了一个小的改动。在我将“throw”错误行更改为“”Error: Line $($_.LineNumber+1) is missing the comma delimited record”之后,它现在正在查找文件中的所有错误。我只需要它列出所有找到匹配项的行号。这是 Linux BASH 中的一个工作示例: pcregrep -Mn '[~]\r\n[^~]' MyTextFile.txt
  • 这是我现在的工作代码:Select-String -Path MyTextFile.txt -Pattern '^~$' -Context 1 | Foreach-Object { if ($_.Context.Postcontext -notmatch '^~') { "Error: Line $($_.LineNumber+1) is missing the comma delimited record" }
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-15
  • 2011-09-03
  • 2012-05-10
  • 2021-10-25
  • 2020-07-17
  • 1970-01-01
  • 2013-12-03
相关资源
最近更新 更多