【问题标题】:Using Regular Expression to Find content between two double quotes [duplicate]使用正则表达式在两个双引号之间查找内容[重复]
【发布时间】:2020-12-04 20:08:02
【问题描述】:

我正在尝试使用正则表达式来查找和替换使用sed 的xml 文件中的两个双引号括起来的内容,例如"contents like this..."

特别是,我想用 xml 文件中的固定字符串 "2:15,AM" 替换 autoLogoffTime 的任何内容。

我的 XML 文件的一些内容

<SystemSettings executionSummaryExportDir="/home/Jts/" autoLogoffTime="11:45,PM" repetitiveSnapshotDelay="500" snapshotCostReminderLimit="10" snapshotExcessiveUsageLimit="50" autoExportDirectory="/home/$

在不同的目录中有一些 XML 文件我想替换字符串。 autoLogoffTime 的内容可以有空格也可以没有,例如:

autoLogoffTime="11:45,PM" 
autoLogoffTime="11:45, PM"

我尝试使用* 查找所有字符(空白和非空白),但它似乎不是正确的正则表达式。

sed -i.bak 's/autoLogoffTime="*"/autoLogoffTime="2:15,AM"/g' file.xml

有人可以帮忙吗?

【问题讨论】:

    标签: ubuntu sed


    【解决方案1】:

    首先,修改 XML 文件的最佳方法是使用特定于 XML 的工具。 sed 应仅在这些工具不可用时使用。因此,只有在有充分理由无法将它们安装在您的系统上时才使用此答案。

    在 shell glob 中,"*" 表示两个双引号,它们之间有任何字符。 但是,sed 不使用 glob,它使用正则表达式。在正则表达式中,* 表示前一个字符的零个或多个。因此,"*" 匹配零个或多个 ",后跟 "

    试试:

    sed -i.bak 's/autoLogoffTime="[^"]*"/autoLogoffTime="2:15,AM"/g' file.xml
    

    "[^"]*" 匹配",后跟零个或多个任意字符除了 ",后跟"

    【讨论】:

    • 谢谢你,约翰的回答。你会推荐使用什么来替换 XML 字符串?您介意使用特定于 XML 的工具提供答案吗?真的很感激。
    • xmlstarlet 似乎很受欢迎。可能还有其他人。 (我几乎没有理由自己使用一个。)
    猜你喜欢
    • 2019-04-15
    • 1970-01-01
    • 2017-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-12
    • 2020-11-04
    • 2014-02-04
    相关资源
    最近更新 更多