在unix系统中经常需要替换某一类文件中的内容,例如:把*.xml文件里的aaaa替换成bbbb这样的操作.

为了方便操作,我们可以封装一些脚本.

bash:

 

 1 #!/usr/bin/bash
2
3 old_str=$1
4 new_str=$2
5 file_name=$3
6
7 echo "old_str:[$old_str]"
8 echo "new_str:[$new_str]"
9 echo "file_name:[$file_name]"
10
11 change_fun()
12 {
13 old_str1=$1
14 new_str1=$2
15 file_name1=$3
16 (echo "vi ${file_name1} <<-!";
17 echo ":%s:$old_str1:$new_str1:g";
18 echo ":wq";
19 echo "!";
20 )|sh
21 }
22
23 for filename in `ls ./*${file_name}*`
24 do
25 change_fun "$old_str" "$new_str" "$filename"
26 #echo "change_fun \"$old_str\" \"$new_str\" \"$filename\""
27 done

这是通过vi打开一个文件,然后在通过s:/old_str/new_str/g 这样的命令来替换.

 

但是,好好回想一下,貌似可以直接sed来实现,不需要用vi去打开文件再来执行替换命令再保存文件这么麻烦. 

 

sed:

1 sed -i 's/old_str/new_str/g' *filename*
2 或者
3 ls *filename* |xargs -n 1 sed -i 's/old_str/new_str/g'
 

如果是sed的老版本不支持 -i 参数. 那就不能修改源文件.只能是先把替换的结果用重定向符输出到一个临时文件,然后再覆盖源文件了.

 

我使用的系统就是安装的sed就是老版本的.由于不能支持-i参数,又觉得重定向,再覆盖不能一步完成很麻烦.幸运的是发现了另一个好的办法.

perl: 

perl -pi -e 's/old_str/new_str/g' *filename*

 

 总结一下:

  一个问题在网上顺便找找就能找到这么多解决方法.不由想到一句话,     生活中缺少的是对美的发现.