使用sed命令将数字替换为另一个数字的正则表达式失败

时间:2018-05-31 11:46:15

标签: regex sed

我想使用sed命令将数字替换为xml文件中的另一个数字。特定参数<l_num>的值介于016之间。所以,我使用正则表达式来完成这个任务:

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

这里可能出现什么问题?

1 个答案:

答案 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