简洁的想法

仁爱、喜乐、和平、忍耐、恩慈、良善、信实、温柔、节制

Sed 批量替换文件中的字符

| Comments

下载了ruby的Standard Library Documentation, 发现其离线版本的home链接居然是’/’, 这在使用中会指向file:///, 所以还是替换一下吧: 把

1
<a href='/' target='_top' >Home</a>

替换成

1
<a href='index' target='_top' >Home</a>

用这个命令:

1
$ sed -i -e "s/'\/' target/'\/index.html' target/g" *.html

如果想替换前做个备份:

1
$ sed -i.bak -e "s/'\/' target/'\/index.html' target/g" *.html

如果想把当前目录及子目录下的文件都替换掉, 那可以这样写:

1
$ find . -type f | xargs sed -i.bak -e "s/'\/' target/'\/index.html' target/g"

当然这只是个例子, 因为子目录下的html文件中的home链接如果也换成了index.html, 那还是不能链接到父目录中的index.html.

因为换成了octopress, 所以留言也托管到disqus了, 导入留言后, 发现blog下方的留言不能显示, 查看源代码发现链接最后没有斜线 “/”, 我在disqus里面换链接的时候, 设置成都以斜线结尾.

链接最后没有斜线
1
2
3
4
5
6
7
8
9
10
11
12
<script type="text/javascript">
      var disqus_shortname = 'neten';
        // var disqus_developer = 1;
        var disqus_identifier = 'http://blog.neten.de/posts/345/';
        var disqus_url = 'http://blog.neten.de/posts/345/';
        var disqus_script = 'embed.js';
    (function () {
      var dsq = document.createElement('script'); dsq.type = 'text/javascript'; dsq.async = true;
      dsq.src = 'http://' + disqus_shortname + '.disqus.com/' + disqus_script;
      (document.getElementsByTagName('head')[0] || document.getElementsByTagName('body')[0]).appendChild(dsq);
    }());
</script>

打开source/_posts/2012-03-25-345.textile

1
permalink: /posts/345

发现345后面没有斜线, 如果在vi里面可以这样替换掉:

1
:g/\(permalink:\s\/posts\/\d\+\)$/s//\1\//g

但面对 source/_posts/下面二百多篇文章, 一个一个加斜线显然不现实, 那只好请出强大的sed

1
$ sed -i -e 's/permalink:\(.*$\)/permalink:\1\//g' *.textile

最后再写一个网上看到的处理电话号码的scripts作为结束吧. 一个文本文件phone.txt里面包含内容如下:

1
2
3
4
5
6
5555551212
5555551213
5555551214
6665551215
6665551216
7775551217

前三位是区号, 要用()包起来, 使用”&”来匹配前面查找的内容:

1
$ sed -e 's/^[[:digit:]][[:digit:]][[:digit:]]/(&)/g' phone.txt

参数不含”-i”, 所以不会改动文件, 只会显示结果如下:

1
2
3
4
5
6
(555)5551212
(555)5551213
(555)5551214
(666)5551215
(666)5551216
(777)5551217

如果想先把区位用括号包起来, 然后在这之后的第三位想再加入一个”-“, 这时可以多个命令一起用:

1
$ sed -e 'command1' -e 'command2' ... -e 'commandN' files

例子:

1
$ sed -e 's/^[[:digit:]]\{3\}/(&)/g' -e 's/)[[:digit:]]\{3\}/&-/g' phone.txt

结果如下:

1
2
3
4
5
6
(555)555-1212
(555)555-1213
(555)555-1214
(666)555-1215
(666)555-1216
(777)555-1217

如果想表达得更清楚, 可以这样玩:

1
$ cat phone.txt | sed 's/^(\(.*\))\(.*\)-\(.*$\)/Area code: \1 Second: \2 Third: \3/'

结果如下:

1
2
3
4
5
6
Area code: 555 Second: 555 Third: 1212
Area code: 555 Second: 555 Third: 1213
Area code: 555 Second: 555 Third: 1214
Area code: 666 Second: 555 Third: 1215
Area code: 666 Second: 555 Third: 1216
Area code: 777 Second: 555 Third: 1217

Comments