sed 查找并替换字符串

sed 查找并替换字符串

我在多个文件中有这些行:

<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\>/' {} \;

相关内容