如何从shell脚本中搜索和替换文件中的文本?

时间:2009-08-13 18:50:21

标签: linux ubuntu

我正在尝试编写一个shell脚本,在启动时在配置文件中进行搜索和替换。

我们要替换的字符串是:

include /etc/nginx/https.include;

我们希望将其替换为注释版本:

#include /etc/nginx/https.include;

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

/etc/nginx/app-servers.include 

我不是Linux大师,似乎无法找到执行此操作的命令。

4 个答案:

答案 0 :(得分: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以确保安全 - 如果您更改一个,则另一个将遵循。因此,%#$1%实际上是%的第二个s,后跟所需的#$1,表示括号内的模式,最后{{1} } %

HTH。 HAND。

答案 1 :(得分:3)

  

sed -i's / foo / bar / g'config.txt

这将用文件config.txt中的bar替换foo的所有实例(不区分大小写)

答案 2 :(得分:2)

结帐sed

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

-i表示就地替换,-r表示使用扩展正则表达式。

答案 3 :(得分:0)

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

此脚本shold将路径名

中所有文件中的字符串ABCD替换为DCBA