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,一种在regexRegex
    s/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