regex 正则表达式在powershell中选择多行

ndh0cuux  于 2023-01-14  发布在  Shell
关注(0)|答案(3)|浏览(109)

我创建了一个文件

echo "test 1", Hello, foo, bar, world, "test 2" > test.txt

结果是这样的

test 1
Hello
foo
bar
a better world
test 2

我需要删除所有以关键字"Hello"开头并以"world"结尾的文本,包括这两个关键字。
就像这样

test 1
test 2

我试过了

$pattern='(?s)(?<=/Hello/\r?\n).*?(?=world)'
(Get-Content -Path .\test.txt -Raw) -replace $pattern, "" | Set-Content -Path .\test.txt

但什么都没发生我能试试吗

w8rqjzmb

w8rqjzmb1#

假设您想删除开始和结束关键字,您可以使用(?s)\s*Hello.*world(?s)\s*Hello.*?world,这取决于您希望.*greedy 还是 lazy

(Get-Content path\to\file.txt -Raw) -replace '(?s)\s*Hello.*world' |
    Set-Content path\to\result.txt

使用-creplace进行区分大小写的关键字匹配。

5n0oy7gb

5n0oy7gb2#

先不考虑正则表达式中有多余的/,将其重新表述如下:对Santiago Squarzon的提示。

$pattern = '(?sm)^Hello\r?\n.*?world\r?\n'

(Get-Content -Path .\test.txt -Raw) -replace $pattern | 
  Set-Content -Path .\test.txt

这将删除以Hello开头的行,一直到以world结尾的(第一个)后续行,包括下一个换行符。这将产生所需的输出,如您的问题所示。
至于你所尝试的
除了多余的/字符之外,您的主要问题是您正在使用 *look-aroundAssert *((?<=...)(?=...),这导致它们匹配的内容 not 被捕获为整个匹配的一部分,因此 not-replace替换。

brvekthn

brvekthn3#

我认为这是与How can I deleted lines from a certain position?或任何包含的其他副本的副本:

'test1', 'Hello', 'foo', 'bar', 'world', 'test2' |SelectString -From '(?=Hello)' -To '(?<=world)'

相关问题