我在多个文件中有这些行:
<update>2013-02-10</update>
<version>1.15</version>
我想用(新日期和版本)替换它们:
<update>2019-06-30</update>
<version>1.28</version>
如何使用 sed 或 awk 对多个文件执行此操作? (我使用的是 Mac 操作系统)
编辑1:行<update> and <version>
不是一个接着一个,我想替换它们的每一个出现。
编辑2:日期有所不同,但字符串<update>
没有改变,所以我不能使用查找“2013-02-10”并替换为“新日期”
答案1
sed -i backup -E '/<update>/s/[0-9]{4}-[0-9]{2}-[0-9]{2}/2019-06-30/;/<version>/s/[0-9]\.[0-9]{1,2}/1.28/' *
-i backup
意味着在文件所在的位置编辑文件,但保留扩展名为backup
.如果命令符合您的预期,您可以删除它们。如果它做了其他事情,您会很高兴有备份!-E
用于扩展正则表达式。使脚本更具可读性,因为您不需要转义{}
- 对于具有模式的每一行,
/<update>/
用给定日期s/[0-9]{4}-[0-9]{2}-[0-9]{2}/2019-06-30/
替换日期字符串####-##-##
- 对于带有模式的每一行,
/<version>/
用给定版本s/[0-9]\.[0-9]{1,2}/1.28/
替换版本字符串#.#
或#.##
答案2
如果您不介意输入两个命令,可以使用:
sed -i 's/\<update\>2013-02-10\<\/update\>/2019-06-30\<\/update\>/g' *
sed -i 's/\<version\>1.15/1.28\<\/version\>/g' *
在文件所在的主目录中。
或者,如果您希望它递归执行:
find ./ -type f -exec sed -i 's/\<update\>2013-02-10/2019-06-30\<\/update\>/' {} \;
find ./ -type f -exec sed -i 's/\<version\>1.15/1.28\<\/version\>/' {} \;