powershell - 为什么 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
两行。
解决方案
Select-String
会将文件分成几行。应用正则表达式时不再存在\n
。
如果您需要\n
在场,请使用将文件读入一个大字符串Get-Content -Raw
(不使用-Raw
,Get-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]
是“c
或x
”,不确定你是否有这个想法.
表示“任何字符”,而不是“点” - 点将是\.
如果您的意思是“.cs
或.xml
或.xaml
或.saml
”之类的东西,最好只写它而不是让它变得复杂。
#[: ](.)\w+\.(cs|xml|xaml|saml):\d+\nmsgstr ".*"
推荐阅读
- date - 如何将字符串 yyyy-mm-dd 转换为月份名称?
- php - 如何在 PHP 中使用 Laravel Query Builder 和 Where 子句?
- vuejs2 - 使用v-for时,为什么key prop值没有传播到子组件?
- ios - 计划链接回 Web 应用程序?
- c++ - 尾随返回类型中占位符类型的目的是什么?
- excel - 列中每个单元格中的下拉列表(Excel)+自动完成和滚动
- emu8086 - 需要在 8086 汇编中澄清一下,将 BCD 编号加载到寄存器中后,寄存器包含什么?
- version - 如何为元数据编号版本
- sql-server - SQL Server 表未使用默认值
- sql - SSIS:如何在数据流任务中运行存储过程