Regex 在macOS上使用Perl在bash中匹配多行模式
在Regex 在macOS上使用Perl在bash中匹配多行模式,regex,bash,macos,perl,Regex,Bash,Macos,Perl,在macOS上,使用内置的bash,我需要匹配文件中两行连续的两个单词,比如myKey和myValue 示例文件: <dict> <key>myKey</key> <string>myValue</string> </dict> 问题是,我如何在不替换任何内容的情况下简单地查找文件是否包含该键/值对,或者更重要的是,仅了解是否进行了任何替换 编辑: 在替换模式中:\1->$1 对问题作了澄清 对于基本问题,
macOS
上,使用内置的bash
,我需要匹配文件中两行连续的两个单词,比如myKey
和myValue
示例文件:
<dict>
<key>myKey</key>
<string>myValue</string>
</dict>
问题是,我如何在不替换任何内容的情况下简单地查找文件是否包含该键/值对,或者更重要的是,仅了解是否进行了任何替换
编辑:
\1
->$1
对于基本问题,您只需要将替换运算符更改为匹配运算符,并根据其是否匹配有条件地打印。这也可以通过替换来实现 但是,由于这是在
bash
脚本中,因此您还可以使用指示是否存在匹配/替换的代码退出perl程序(一行代码);然后脚本可以检查$?
仅检查模式是否在文件中
perl -0777 -nE'say "yes" if /pattern/' -- "$file"
-0777
,它将整个文件“slurp”成$\uu
,比使用空字节作为记录分隔符的-0
更安全。此外,这里您不需要-i
(就地更改文件),而需要-n
(循环记录)而不是-p
(也打印每个记录)。我使用-E
而不是-E
来启用(所有)功能
s,比如说。看看这一切
在shell脚本中,您可以在exit
perl -0777 -nE'exit(/pattern/)' -- "$file"
# now check $? in shell
现在,您可以通过编程方式检查是否在文件中找到该模式
最后,运行原始替换并能够检查是否进行了任何替换
perl -i -0777 -pe'exit(s/pattern/replacement/)' -- "$file"
# now check $? in shell
现在,shell中的退出代码so$?
是替换的数量
请记住,这确实滥用了返回代码的基本成功/失败逻辑
有关正则表达式教程,请参阅。可能需要对其进行解析。在我看来,它就像XML,一种在regexRegexs/a/X/
中很难建模的语法,它将a
更改为X
,而m/a/
匹配a
(好吧,尝试这样做)。默认情况下,这两种方法都适用于$\uu
。匹配本身返回true/false,因此如果/a/
,您可以执行说“是”(如果匹配a
,则打印“是”,如果$中存在a
)。您可以将m
与/…/
分开。然后,如果您添加了paren,/(a)/
它还捕获(无论它匹配什么,a
),并在列表上下文中调用时返回。顺便说一句,使用$1
(etc)替换,而不是\1
,但如果您只想扫描文件以查看该模式是否存在,请删除该-i
,然后将-p
更改为-n
。所以perl-0777-nE'if/your pattern/”说“是”…
。-0777
拖拉整个文件,这就是您的-0
所使用的文件,但是-0
实际上可以做其他事情(尽管不太可能),就像我向您展示的那样。您可以在Perl中反转通常的if(COND){…}
(并不总是这样),如果COND,则转到说“yes”代码>(现在甚至不需要在条件周围设置参数)。所以我用,如果/../,就说“是”
测试正则表达式是否匹配(默认情况下,它是一行中当前读取的行),如果匹配,则打印yes
。(say
是带有换行符的打印
。要启用它,您需要使用功能“say”
。在一行中,-E
而不是-E
启用所有“功能”)。我的第二条评论是完整的一行;只需输入您的模式和要处理的文件。仔细想想。。。您还可以做另一件事:使用指示是否存在匹配的代码从该Perl程序(一行代码)退出。所以perl-0777-nE'exit(/…/)'…
。因此,在执行此命令之后,$?
(在bash
中)如果存在匹配项,则将具有1
,如果不存在匹配项,则具有0
。更好的是,你似乎想做那个替换,但只想知道是否发现了任何东西。。。在这种情况下,您可以执行相同的操作,因为s/../../
运算符返回所生成的子节点数。所以perl-i-p0e'退出(s/../…/)'…
perl -i -0777 -pe'exit(s/pattern/replacement/)' -- "$file"
# now check $? in shell