【问题标题】:Sed does not recognize Regex with double quoteSed 无法识别带有双引号的正则表达式
【发布时间】:2020-03-09 04:53:24
【问题描述】:

我正在尝试将以下清单中的 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 无法识别 regex 表达式,尽管在 regex101 上它准确地显示了我想要替换的文本 (https://regex101.com/r/yHFkrV/1)。

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

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

【问题讨论】:

标签: ubuntu sed


【解决方案1】:

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

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

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

查看online sed demo

详情

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

【讨论】:

  • 非常感谢您的解决方案。你能解释一下为什么我的表达不起作用吗?
  • @Kyoshin 您不能在 sed POSIX 正则表达式模式中使用环视。 POSIX 正则表达式标准不支持它们。
猜你喜欢
  • 2015-08-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-11-10
  • 1970-01-01
  • 2016-07-29
相关资源
最近更新 更多