在<set-header name="Host" exists-action="override">
<value>api.ase.com</value>
</set-header>
上,使用内置macOS
,我需要在文件中的两个连续行上匹配两个单词,例如bash
和myKey
。
示例文件:
myValue
我已经有一个有效的命令,可以使用<dict>
<key>myKey</key>
<string>myValue</string>
</dict>
在这样的一对中替换一个值:
perl
问题是,我如何简单地查找文件是否包含键/值对,而不替换任何内容,或者更重要的是,要知道是否进行了替换?
编辑:
perl -i -p0e 's/(<key>myKey<\/key>\s*\n\s*<string>).+(<\/string>)/$1newValue$2/' -- "$filepath"
-> \1
。答案 0 :(得分:2)
对于基本问题,您只需要将替换运算符更改为match运算符,并有条件地打印是否匹配即可。也可以通过替换来完成。
但是,由于它是在bash
脚本中,因此您也可以从perl程序(单行代码)中exit
使用指示是否存在匹配/替换的代码;那么脚本可以检查$?
。
仅检查文件中是否包含模式
perl -0777 -nE'say "yes" if /pattern/' -- "$file"
-0777
(将整个文件“吸收”到$_
中)比使用空字节作为记录分隔符的-0
更安全。另外,在这里,您不需要-i
(在原位置更改文件 ),而不是-n
(遍历记录),而不是-p
(也打印每个记录) 。我使用-E
而不是-e
为feature
启用(全部)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。