2009-08-13 86 views
1

我试图编写一个shell脚本,在启动时执行搜索并在配置文件中进行替换。如何从shell脚本中搜索和替换文件中的文本?

我们试图替换字符串是:

include /etc/nginx/https.include; 

,我们想用一个注释版本来替换它:

#include /etc/nginx/https.include; 

包含我们要替换的字符串的文件是:

/etc/nginx/app-servers.include 

我不是一个Linux的大师,似乎无法找到的命令来做到这一点。

+0

这对于serverfault.com,imho更合适。 – 2009-08-13 18:55:03

+0

我不明白为什么它适合serverfault。它似乎与服务器没有任何关系。它属于超级用户。投票结束。 – rmeador 2009-08-13 19:14:44

+0

/bin/sh或bash或csh或任何其他shell是图灵完整语言。你为什么不认为“如何在Y语言中实现X?”属于StackOverflow? – dmckee 2009-08-14 02:14:59

回答

7
perl -p -i -e 's%^(include /etc/nginx/https.include;)$%#$1%' /etc/nginx/ap-servers.include 

如果该行可能不会在;结束,则应使用:

perl -p -i -e 's%^(include /etc/nginx/https.include;.*)$%#$1%' /etc/nginx/ap-servers.include 

如果你想保留原始文件,添加一个备份扩展-i后:

perl -p -i.bak -e 's%^(include /etc/nginx/https.include;)$%#$1%' /etc/nginx/ap-servers.include 

现在解释一下。 -p标志表示就地替换。文件的所有行都将被输入到表达式中,结果将被用作替换。 -i标志表示备份文件的扩展名。通过无任何使用,您可以防止生成备份。 -e告诉Perl获取以下参数作为要执行的表达式。

现在,表达式是s%something%other%。我使用%而不是更传统的/来避免必须避开路径的斜杠。我在表达式中使用括号并在替代表达式中使用括号 - 如果您更改了一个,则另一个将会跟随。因此,%#$1%实际上是s第二%,接着是所需的#$1指示在括号内的图案,以及s最后%

HTH。手。

+0

+1为解决方案,并为这种情况下使用另一个更好的字符(%),而不是更传统的/ – 2009-08-13 18:54:38

2

退房sed

sed -i -r 's|^(include /etc/nginx/https.include;)$|#\1|' /etc/nginx/app-servers.include 

-i手段做替代就地和-r表示使用扩展正则表达式。

0
cd pathname 
for y in `ls *`; 
do sed "s/ABCD/DCBA/g" $y > temp; mv temp $y; 
done 

这个脚本shold替换字符串ABCD到DCBA中的所有文件路径名

3

的sed -i 'S /富/酒吧/ G' 的config.txt

这取代在文件config.txt中带有bar的所有实例(不区分大小写)