首页 > 解决方案 > Sed 无法识别带有双引号的正则表达式

问题描述

我正在尝试用当前日期替换以下清单中的 android:versionName 值:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    coreApp="true"
    package="com.btaudio"
    android:versionName="0.7-191027"
    android:sharedUserId="android.uid.system">

这是我的带有 sed 命令的批处理脚本:

chmod 777 AndroidManifest.xml

test=$(date '+%y%m%d')

sed 's|(?<=-).*?(?="\n)|'"$test"'|g' AndroidManifest.xml

我的想法是抓住“-”和后跟换行符的双引号之间的文本,使用分隔符后变量工作正常。

谁能向我解释为什么 sed 无法识别正则表达式,尽管在 regex101 上它准确显示了我想要替换的文本(https://regex101.com/r/yHFkrV/1)。

我已经阅读了有关使用 -e、-E 或 -r para 的信息,但这些都不适合我。我也尝试了一些对表达式的分隔符,但它似乎没有任何效果。

编辑:我在 Ubuntu 16.04.3 LTS 上使用 sed (GNU sed) 4.2.2

标签: ubuntused

解决方案


您不能在sedPOSIX 正则表达式模式中使用环视。

改用消费模式并使用 RHS 恢复它们,替换模式(这很容易,因为它们是硬编码字符,您甚至不需要额外的捕获组):

sed -i 's|-[^"]*"$|-'"$test"'"|g' AndroidManifest.xml

查看在线sed演示

细节

  • -i- 对文件的内联更改
  • s- 替换命令
  • -[^"]*"$- -,任何 0 个或多个字符,而不是"字符串的结尾
  • -'"$test"'"- -,然后是$test值,然后"
  • g- 多次出现(虽然在这里似乎是多余的)

推荐阅读