linux 查找并替换文件中的指定内容

起因

在我刚刚把nginx搬到QTCreator的时候,由于nginx源码都是使用#include <xx.h>的形式,原先我并没有把nginx的头文件放在系统库头文件的变量中,于是乎,我脑抽般的想起,我把<>替换成“”的形式,这样就可以方便的运行了,当然,这个我想的太理想了,略2,但是还是让我学习到了如何查找并替换文件中的特定内容。

相关命令

我使用了这样的命令

<pre lang=”shell”>

find -name “.c” | xargs sed -i ‘s/<([a-z|A-Z|_|0-9].h)>/“\1”/g’

</pre>

现在来详细解释一下,find命令是用来查找文件的

详细可参见find 用法实例

xargs这个是给命令传递参数的一个过滤器,是传递内容的,

详细可参见xargs命令

sed这个命令可以参见sed命令

我解释一下我的用法,因为我是要替换“#include <xx.h>”中的<>成为””,所以使用

<pre lang=”shell”>

sed -i ‘s/<([a-z|A-Z|_|0-9]*.h)>/“\1”/g’

</pre>

-i的意思是把改变了的内容要回写进文件

至于后面一句是sed用来匹配替换文本,

s表示替换的意思

<([a-z|A-Z||0-9]*.h)>是我们的<xx.h>因为xx.h是变化的,所以我们使用正则表达式([a-z|A-Z||0-9]*.h)来准确的获取,但是我们要对()进行转义

“\1”:这里\1的意思就是正则表达式([a-z|A-Z|_|0-9]*.h)匹配上的第一个的字符串的值,同理\2就是匹配上的第二个字符串的值,它是一个变量。这样子我们就实现了这种替换。