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
我 运行 这个 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