背景
我们经常需要对一些配置文件进行修改,这些配置文件的内容依不同项目而变,但大体结构不变,所以可以批量修改。
例如下图这个C结构体
的字段,需要将其值从256改成512,该字段是个数组,占了2行,且出现在多个.h
文件,手工修改工作量非常大,必须用脚本来做。
我通常使用find
加sed
命令来做,不过网上对sed的介绍都比较浅,很少讲解如何匹配一个完整段落(即起始行
和终止行
均为模式串
)的情况,其实这种需求sed是完全可以满足的。
思路
首先通过find命令过滤出所有的.h
格式的配置文件,然后通过sed命令的-i
选项就地
执行修改操作。
如果我们只提供了一个模式串,则sed只匹配一行,能修改的也就只有一行,这不符合我们的需求,因此sed的行匹配语句必须精心构造。
我们必须匹配多行,但是匹配多行也有很多选择,我选择用下一个字段
来提供边界
,这样的好处是不管目标字段是多少维数组,都能精确匹配。
最终脚本
find sensor/ -name '*.h' | xargs sed -i '/nWienerFactor/,/nNlmFactor/{s/256/512/g}'
这个脚本一次性修改了24个.h
文件中的48个字段,非常高效!
总结
使用sed的精髓就在模式串的选择。