我在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
非常感谢任何帮助。
答案 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*)
,以匹配任何space
,tab
或newline
字符零使用\n\t
替换模式中的更多次$1
:
perl -0pi -w -e 's/Disabled<\/key>(\s*)<true/Disabled<\/key>$1<false/g' file
这似乎更适合匹配出现在两行之间的任意数量的空白字符。