给定

给定

我正在尝试使用 sed 命令替换以下节点的值。

<KeyValue key="EMPTY_SEARCH_CRITERIA" type="String" value="CS_CODE" comment="Configured empty search criteria."/>

我使用通配符,因为初始值可以包含任何字符串值。例如。

sed -e 's/value=.*/value="SN_CODE,CS_ID" comment="Configured empty search criteria."\/\>/g' CMS_conf.xml > tempfile
         ^        ^                                                                     ^

但是,在这种情况下,我也必须包含 comment 属性。

有什么方法可以在不输入评论属性的情况下完成此操作吗?

答案1

我会使用正则表达式的 perl 方言。如果您使用的系统上有sed,那么您很可能有 perl。

给定

<KeyValue key="EMPTY_SEARCH_CRITERIA" type="String" value="CS_CODE" comment="Configured empty search criteria."/>

Perl 正则表达式

perl -i -pe 's/(value=)".*?"/\1"some_replacement_string"/g' <filename>

笔记

您可能想首先通过打印到终端来测试这一点。

perl -pe 's/(value=)".*?"/\1"some_replacement_string"/g' <filename>

或者创建带有扩展名的备份.bak

perl -i.bak -pe 's/(value=)".*?"/\1"some_replacement_string"/g' <filename>

正则表达式解释:

  • (): 组作为变量 \1
  • ": 由于单引号表达式,引号是字面意思,因此无需转义它们。
  • ?:用于驯服 *,这意味着它将在第一场比赛时停止吞噬(并且不会继续咀嚼直到最后一个“。sed不支持非贪婪运算符,但您可以在另一个答案中使用该技巧[^"]*",这意味着吞噬所有字符在这种情况下,这实际上做了同样的事情。

答案2

如果您特别想将 CS_CODE 更改为 SN_CODE,CS_ID,您可以使用:

's/CS_CODE/SN_CODE,CS_ID/g'

如果值不同,您可以使用

's/value=\S*\S/value="SN_CODE,CS_ID"/g'

答案3

sed不是 html(或任何其他编程语言)处理的最佳选择,但无论如何:

sed -e 's/\(value\)="[^"]*"/\1="SN_CODE,CS_ID"/'

有两个可能不太明显的点:

  • with\(并且\)我们将一个模式分组以便稍后使用它\1
  • [^"]*用于匹配除 a 之外的任何字符"

相关内容