perl pie 转义分隔符

perl pie escape the delimeter

我 运行 这个 perl 命令 Mac OS 删除整行。

perl -i -pe's/<meta-data android:name="com.facebook.sdk.ApplicationId" android:value="@string/fb_app_id"/>/ /g' AndroidManifest.xml

结果是

fb_app_id"@string/fb_app_id"/> 

我无法逃脱 "@string/fb_app_id 中的 / 尝试了不同的变体 @string//fb_app_id@string\/fb_app_id 但 none 有效。

你可以尝试使用定界符 [] 吗?

perl -i -pe's[<meta-data android:name="com.facebook.sdk.ApplicationId" android:value="\@string/fb_app_id"/>][ ]g' AndroidManifest.xml

如果您一直在使用警告,您会被告知 @strings 被视为一个变量并在正则表达式中进行插值。您应该尝试转义 @。还有斜杠。

perl -i -pe's/<meta-data android:name="com.facebook.sdk.ApplicationId" android:value="\@string\/fb_app_id"\/>\/ /g' AndroidManifest.xml 

运行 没有警告的 Perl 命令是个坏主意,即使您是 Perl 专家也是如此。

值得注意的事情:

  • 您不应使用正则表达式解析 XML。 Related infamous answer.
  • 您不需要使用替换,您可以使用 m//-n 开关尝试更宽松的匹配,然后避免打印匹配行。例如
perl -i -nwe'print unless m|android:value="\@string/fb_app_id"|'

尽管在 XML 上使用正则表达式存在危险,但您通常会按照以下方式执行此类任务。

使用花括号作为分隔符。 s{}{}
手动转义这些字符。 $ @ \ --> $ \@ \
如果是固定字符串,用\Q\E包裹起来。否则句点和其他正则表达式元字符将导致意想不到的效果。

perl -i.bak -pe 's{\Q<meta-data android:name="com.facebook.sdk.ApplicationId" android:value="\@string/fb_app_id"/>\E}{ }g' AndroidManifest.xml

仅仅注释掉块:

perl -i.bak -pe 's{(\Q<meta-data android:name="com.facebook.sdk.ApplicationId" android:value="\@string/fb_app_id"/>\E)}{<!--  -->}g' AndroidManifest.xml

HTH