首页 > 解决方案 > 为什么 powershell 正则表达式不能与 \n 一起使用?

问题描述

我有一个包含数千行的文本文件,看起来像这样:

# RandomLocation.xaml:1234
msgid "RandomString"
msgstr ""

# AnotherLocation.cs:123
msgstr ""

我需要找到并删除其中没有msgid的每个块,并且我正在尝试通过使用正则表达式来实现这一点。

$temp | ForEach-Object{
    Select-String -Path $($DestinationPath + $culturename + ".po") -Pattern '#[: ](.)\w+.[cx][sa][m]{0,1}[l]{0,1}:\d+\nmsgstr ".*"' -AllMatches | ForEach-Object {
            $_.Matches | ForEach-Object{
                $temp2 = $_.Value
                $delete.Add($_.Value)
}
}
}

如果我 \nmsgstr ".*"'从模式中删除,它可以正常工作并检测到 every # RandomLocation:1234,但是当我试图找到两行时它不起作用。任何想法我做错了什么?

@edit:它有效,但是我无法从文件中删除这些行。它是一个数组列表,在删除单行的同时$file.Remove($_.Value),它没有$_.Value两行。

标签: powershell

解决方案


Select-String会将文件分成几行。应用正则表达式时不再存在\n

如果您需要\n在场,请使用将文件读入一个大字符串Get-Content -Raw(不使用-RawGet-Content也会将文件分成几行),然后将该字符串传递给Select-String.

Get-Content -Path "..." -Raw | Select-String -Pattern "...\n"

话虽如此,您的正则表达式看起来有点可疑

#[: ](.)\w+.[cx][sa][m]{0,1}[l]{0,1}:\d+\nmsgstr ".*"
  • [m]同理m,字符类[]对单个字母没有影响
  • {0,1}是相同的?
  • [cx]cx,不确定你是否有这个想法
  • .表示“任何字符”,而不是“点” - 点将是\.

如果您的意思是.cs.xml.xaml.saml之类的东西,最好只写它而不是让它变得复杂。

#[: ](.)\w+\.(cs|xml|xaml|saml):\d+\nmsgstr ".*"

推荐阅读