我有一个Windows批处理文件,它使用sed
来操作文件。该操作包括简单的替换,例如
sed -e s/PATTERN/OTHERS/g infile >outfile
sed -e "/^.*COPY_START/,/^.*COPY_END/ d" infile >outfile
第一个可以替换为
Get-Content infile | %{ $_ -replace 'PATTERN', 'OTHERS' } | Set-Content outfile
我没有找到如何选择由行标记COPY_START
和COPY_END
删除的一堆线。
如何用PowerShell替换这些sed
命令。
编辑:关于Jeff的评论,我尝试使用以下代码捕获多行问题:
Get-Content infile -replace '(.*)COPY_START\n.*COPY_END(.*)','$1$2'
但是\n
不满足搜索条件。为了隔离我使用的“多行”条件
Get-Content infile -match 'COPY_START\n.*COPY_END'
带有此文件
before
do COPY_START
skip
until COPY_END
after
但是比赛总是$False
。我希望表达式\n.*
应该与COPY_START之后的行尾以及所有行匹配,直到出现COPY_END。
为什么不匹配正则表达式,我该如何解决?
答案 0 :(得分:2)
sed -e "/^.*COPY_START/,/^.*COPY_END/ d" infile >outfile
命令在具有COPY_START
和COPY_END
的行之间查找所有子字符串,并将其从infile
中删除,并将输出保存到outfile
。
要使其在PS中工作,您需要使用-Raw
将文件读入单个变量,并使用类似regex的
(?m)^.*COPY_START(?s:.*?)COPY_END.*$\n?
请参见regex demo。
详细信息
(?m)
-MULTILINE内联修饰符,^
现在将与行首匹配^
-行开始.*
-尽可能多的除LF以外的0+个字符COPY_START
-子字符串(?s:.*?)
-内联修饰符组(其中s
匹配任何字符时,RegexOptions.Singleline
启用.
选项,也称为DOTALL),匹配任何0+个字符,直到第一个都尽可能少COPY_END.*$
-COPY_END
,然后尽可能多地输入除换行符以外的0+个字符\n?
-和可选的换行符。