ubuntu - 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
解决方案
您不能在sed
POSIX 正则表达式模式中使用环视。
改用消费模式并使用 RHS 恢复它们,替换模式(这很容易,因为它们是硬编码字符,您甚至不需要额外的捕获组):
sed -i 's|-[^"]*"$|-'"$test"'"|g' AndroidManifest.xml
查看在线sed
演示。
细节
-i
- 对文件的内联更改s
- 替换命令-[^"]*"$
--
,任何 0 个或多个字符,而不是"
字符串的结尾-'"$test"'"
--
,然后是$test
值,然后"
g
- 多次出现(虽然在这里似乎是多余的)
推荐阅读
- c++ - 在 xCode 和 Visual Studio 中启用 C++ 全面优化
- c# - 如何使用 Entity Framework Core 设置复杂对象?
- codenameone - 代号一 - 验证器的错误消息显示有效输入(更新)
- sql - 学术难题:无需自连接即可导出比例
- c++ - 导入 QtQuick.Window 2.2 未找到 QML 模块
- python - 错误:GDK_BACKEND 与可用显示不匹配;使用 Crontab 运行 Selenium
- java - 通过java将PKCS#1格式的私钥转换为PKCS#8格式的私钥
- c# - Access DB 上的 C# 更新数据不起作用
- javascript - 在 Node 应用程序 API 调用中出现 TLS 错误
- javascript - 验证表列