【问题标题】:sed replace content within double quotessed 替换双引号内的内容
【发布时间】:2015-06-04 16:15:16
【问题描述】:

我需要使用 sed 从 shell 脚本替换 xml 文件中的 versionName。

<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    package="com.example.sed"
    android:versionCode="1"
    android:versionName="UNKNOWN VERSION NAME">

到目前为止,我已经搜索到包含 versionName 的行,但 如何告诉 sed 替换紧跟在 versionName 之后的双引号内的所有内容?

sed -i .old '/versionName/ s/WHAT TO WRITE?/NEW VERSION NAME/' AndroidManifest.xml

【问题讨论】:

  • "\([^"]*\) 应该可以工作
  • 最好使用xmlstarlet

标签: regex bash sed


【解决方案1】:

替换not-",像这样:

sed -i .old '/android:versionName/ s/="[^"][^"]*"/="NEW VERSION NAME"/' AndroidManifest.xml

【讨论】:

  • 请注意,这取决于问题中输入的换行符,每行一个属性。如果 XML 被重新格式化并且非重要的空格被折叠,那么您需要属性名称作为匹配和替换的一部分:s/\(android:versionName\)="[^"]*"/\1="NEW VERSION NAME"/(我也更改为允许空字符串 - 再次,以防万一.
  • @TobySpeight 好吧,总是有this warning。但是假设 OP 对 XML 的生成方式有严格的控制,它仍然可以通过简单的方式完成。
【解决方案2】:

考虑到xml的性质和版本号,使用更简单的命令其实是很安全的:

sed -i '/versionName/s/".*"/"NEW VERSION NAME"/' AndroidManifest.xml

附:在我看来,能够根据具体情况和合理的假设来简化你的 shell 脚本是非常重要的。

【讨论】:

    【解决方案3】:
    sed 's/\([[:blank:]]android:versionName="\)[^"]*"/\1Your New Value"/' YourFile
    
    • 假设所有具有android:versionName 的部分都将被更改
    • 使用 GNU sed 将 [[:blan:k]] 替换为 \(^\|[[:blank:]]\)(如果直接修改避免临时文件,则使用 -i)会更好

    【讨论】:

      猜你喜欢
      • 2016-08-10
      • 1970-01-01
      • 1970-01-01
      • 2013-10-19
      • 1970-01-01
      • 2011-06-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多