我正在尝试使用 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 之外的任何字符"