我想使用sed
命令将数字替换为xml文件中的另一个数字。特定参数<l_num>
的值介于0
和16
之间。所以,我使用正则表达式来完成这个任务:
sed -i -r 's/<l_num>\b^[0-9]([0-9]*)$\b</<l_num>5</g' test.xml
上面给出了一个输入5,并且应该能够在test.xml
中作为一行输出,如下所示,替换已经存在的0到16之间的任何数字:
<l_num>5</lnum>
由于某种原因,这似乎不起作用。预期输出为0到16,单个数字没有任何前导零。例如,如果我用05替换上面的5,那么当我这样做时它不应该更新xml文件:
sed -i -r 's/<l_num>\b^[0-9]([0-9]*)$\b</<l_num>05</g' test.xml
这里可能出现什么问题?
答案 0 :(得分:1)
正则表达式不是操作XML文件的最佳工具。您可以使用XMLStarlet并使用xml ed -u "//l_num" -v "5" file.xml
获取所需内容(也就是说,ed
通过查找l_num
个节点u
v
来验证它们5
{ {1}}使用05
。
如果您不想在替换值为\b
时进行替换,则应在使用replace命令之前运行此检查。
至于你的正则表达式,问题是在模式中使用^
(字边界)和$
/ sed -i -r 's/<l_num>[0-9]+</<l_num>5</g' file
锚点。您需要修复该代码的所有内容为\b
,因为此处^
字边界显然是不必要的,$
仅匹配行的开头,[0-9]([0-9]*)
匹配行尾。 [0-9]+
- 匹配数字,然后匹配0位或更多位数 - 可以在POSIX ERE语法中重写为+
(其中sed
可用于匹配1个或多个匹配项量化原子)。在GNU \+
中,如果您未将-r
选项与sed
一起使用,则还可以在POSIX BRE语法中使用az aks create
。