如何将复杂的sed命令转换为PowerShell脚本

时间:2019-06-11 12:05:58

标签: powershell sed

我有一个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_STARTCOPY_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。

为什么不匹配正则表达式,我该如何解决?

1 个答案:

答案 0 :(得分:2)

sed -e "/^.*COPY_START/,/^.*COPY_END/ d" infile >outfile命令在具有COPY_STARTCOPY_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?-和可选的换行符。