在macOS上使用Perl在bash中匹配多行模式

时间:2018-12-14 04:03:47

标签: regex bash macos perl

<set-header name="Host" exists-action="override"> <value>api.ase.com</value> </set-header> 上,使用内置macOS,我需要在文件中的两个连续行上匹配两个单词,例如bashmyKey

示例文件:

myValue

我已经有一个有效的命令,可以使用<dict> <key>myKey</key> <string>myValue</string> </dict> 在这样的一对中替换一个值

perl

问题是,我如何简单地查找文件是否包含键/值对,而不替换任何内容,或者更重要的是,要知道是否进行了替换?

编辑:

  1. 在替换模式内:perl -i -p0e 's/(<key>myKey<\/key>\s*\n\s*<string>).+(<\/string>)/$1newValue$2/' -- "$filepath" -> \1
  2. 添加了对问题的澄清。

1 个答案:

答案 0 :(得分:2)

对于基本问题,您只需要将替换运算符更改为match运算符,并有条件地打印是否匹配即可。也可以通过替换来完成。

但是,由于它是在bash脚本中,因此您也可以从perl程序(单行代码)中exit使用指示是否存在匹配/替换的代码;那么脚本可以检查$?

仅检查文件中是否包含模式

perl -0777 -nE'say "yes" if /pattern/' -- "$file"

-0777(将整个文件“吸收”到$_中)比使用空字节作为记录分隔符的-0更安全。另外,在这里,您不需要-i(在原位置更改文件 ),而不是-n(遍历记录),而不是-p(也打印每个记录) 。我使用-E而不是-efeature启用(全部)say。查看所有这in perlrun

在shell脚本中,您可以在exit中使用match运算符的true / falsy返回值

perl -0777 -nE'exit(/pattern/)' -- "$file"
# now check $? in shell

现在您可以以编程方式检查是否在文件中找到了模式。

最后,运行原始替换 并能够检查是否进行了

perl -i -0777 -pe'exit(s/pattern/replacement/)' -- "$file"
# now check $? in shell

现在退出代码(即外壳中的$?)是进行替换的次数。

请记住,这确实滥用了返回码的基本成功/失败逻辑。

有关正则表达式教程,请参见perlretut