我对 Powershell 很陌生,所以我无疑做了一些非常愚蠢的事情,导致我尝试让它工作实际上不起作用......但经过一个小时的挣扎,我很乐意帮忙。
我有一个文件,其中三个换行符(两个空行)标记了边界。我只想要边界之后的所有内容。
我最近的无果尝试如下所示:
$content = Get-Content -Raw $Path
$content = $content -Replace '^.+`r`n`r`n`r`n', ''
我所有匹配单个新行的尝试都失败了。 -Raw 参数是因为我开始明白这会改变处理换行符的方式,但它没有改变任何东西。
我也知道正则表达式并不理想;我想让它变得非贪婪,但考虑到我不熟悉 Powershell 支持的任何风格的正则表达式,我希望首先获得一个 super 基本的测试用例。 (我想我可以在 + 之后添加一个 ? 来解决这个问题,但首先要注意的是。)
目标是从
useless metadata I don't care about
more useless metadata
actual content
对此:
actual content
我做错了什么?
最佳答案
'`r`n'
是一个 4 个字符的字符串,而 "`r`n"
是一个换行符 2 个字符的字符串。您的模式不会匹配任何换行符。在 Powershell 正则表达式模式中,使用 \r
匹配 CR 和 \n
匹配 LF 更安全。
另请注意,字符串开头和分隔符之间有几行,但 .
默认情况下不匹配换行符,您需要一个 (?s)
内联修饰符使 .
也匹配换行符。
使用
$content -replace '(?s)^.*?(?:\r?\n){3}'
详细信息
(?s)
- 一个单行选项,使.
也匹配换行符^
- 字符串的开头.*?
- 任意 0 个以上字符,尽可能少(?:\r?\n){3}
- 三重 CRLF/LF 换行符。
请参阅.NET regex demo .
关于regex - 删除所有直到并包括三重换行符的内容,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54864183/