Skip navigation.

生活周遭

In My Circle

sed的in-place edit选项,和RTFM

, , ,

Debian Administration上看到Search and replace across many files with a perl one-liner这篇文章。多文件的Search and Replace的Linux风格处理方式,也是我一直思考的,这篇文章提供的是一个perl的解决方案。而对于这种问题,最直接想到的解决方案应该是sed吧?而且对于Perl,我到现在还是个门外汉。

不过一直以为sed不能直接对源文件修改,必须重定向到新文件,所以觉得在批量处理中很麻烦,因为每次都必须指定新文件名,然后在覆盖回源文件。为此还傻傻的专门写过一个runsed的shell脚本用于处理重定向到中间文件再覆盖回源文件的工作,让sed可以直接修改源文件,适用于批量处理。还沾沾自喜,以为找到了最终的解决方案。

在上面这篇文章中,比较关键的是用到了perl的 -i 参数edit the files in-place,直接修改源文件。这时候我想,sed也是应该有这么一个in-place edit的选项的,只是我以前没有找到罢了。于是man sed,然后在man page的32行就看到了

-i[SUFFIX], --in-place[=SUFFIX]
                edit files in place (makes backup if extension supplied)
这个参数。这时候才觉得自己好傻,没有好好的RTFM,而且还好好的自作聪明了一把。 sed的这个 -i[SUFFIX], –in-place[=SUFFIX] 参数功能还真的很强,除了能够直接修改源文件,还能自动备份源文件,指出备份文件的suffix,真是非常方便。(居家旅游,杀人灭口,必备良药?XD)又可以快乐的sed生活了。

现在,关于 Search and Replace 和 Regular Expression,还有一个问题困扰我,在这儿记下来。 就是将文件中符合某个pattern的字符串打印出来。注意,只是符合这个pattern的字符串本身,而不是所在行。直接一看,这怎么都是grep的工作嘛,可以在对grep狠狠的RTFM以后,还是未果。真是奇怪,总觉得打印搜索到的pattern本身,比打印行要容易的多嘛,怎么会这么难找?Python脚本自然可以很容易就实现,但是总觉得已有的shell工具肯定是有这样的功能了,只是我没找到罢了。希望有达人指点。(不要告诉我grep后sed哦~)

测试 BlogFirefox Space Bar无法滚屏的问题

Comments

Anonymous 15. February 2007, 03:42

Anonymous writes:

GNU sed的较新的版本开始支持-i选项,应该是从perl学来的。
GNU grep 有—o选项,可以只打印匹配的字符串。
如果一行不会有多个匹配,sed、perl都可简单地实现,否则就要非些手脚。
GNU awk则可以轻松完成这个任务:
gawk -v RS='pattern' '{print RT}'

How to use Quote function:

  1. Select some text
  2. Click on the Quote link

Write a comment

Comment
(BBcode and HTML is turned off for anonymous user comments.)

Type the two words displayed in the image below:


Smilies

July 2009
S M T W T F S
June 2009August 2009
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31