让Perl正则表达式匹配换行符后跟macOS中的制表符

时间:2018-06-10 18:05:31

标签: tabs newline

我在macOS .plist文件中有这两行:

    <key>Disabled</key>
    <true/>

我想将true替换为false,但前提是前一行等于<key>Disabled</key>

我知道第一行以\n结尾,使用Perl我可以匹配/替换它:

perl -pi -w -e 's/Disabled<\/key>\n/DISABLED<\/key>\n/g' file

注意:我不想将Disabled更改为DISABLED,这只是为了表明匹配正在发挥作用。

我知道第二行以\t开头,我可以匹配/替换它:

perl -pi -w -e 's/\t<true/\t<false/g' file

但是,组合这两种模式并不匹配/替换任何东西:

perl -pi -w -e 's/Disabled<\/key>\n\t<true/Disabled<\/key>\n\t<false/g' file

我认为第一行末尾的\n和第二行开头的\t之间可能存在隐藏的字符,但我在BBEdit中试过这个正则表达式并且它有效完美:

Disabled</key>\n\t<true

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:0)

看来我对Perl的理解非常有限。

经过进一步的挖掘后,我现在意识到在我使用Perl的代码中逐行读取文件。我需要做的是指示Perl一次性读取文件或以另一种方式“啜饮”文件。使用-0将Perl置于file slurp模式。

我原来的非工作代码:

perl -pi -w -e 's/Disabled<\/key>\n\t<true/Disabled<\/key>\n\t<false/g' file

我使用-0修改了工作代码:

perl -0pi -w -e 's/Disabled<\/key>\n\t<true/Disabled<\/key>\n\t<false/g' file

为了更进一步,我将匹配模式中的\n\t替换为(\s*),以匹配任何spacetabnewline字符零使用\n\t替换模式中的更多次$1

perl -0pi -w -e 's/Disabled<\/key>(\s*)<true/Disabled<\/key>$1<false/g' file

这似乎更适合匹配出现在两行之间的任意数量的空白字符。