sed 是很有用(但常被遗忘)的 unix 流编辑器.在以批处理方式编辑文件或以有效方式创建 shell 脚本来修改现有文件方面,它是十分理想的工具.本文是前一篇介绍 sed 文章的续篇.
替换!
让我们看一下 sed 最有用的命令之一,替换命令.使用该命令,可以将特定字符串或匹配的规则表达式用另一个字符串替换.下面是该命令最基本用法的示例: $ sed -e s/foo/bar/ myfile.txt上面的命令将 myfile.txt 中每行第一次出现的 foo(如果有的话)用字符串 bar 替换,然后将该文件内容输出到标准输出.请注意,我说的是每行第一次出现,尽管这通常不是您想要的.在进行字符串替换时,通常想执行全局替换.也就是说,要替换每行中的所有出现,如下所示:
$ sed -e s/foo/bar/g myfile.txt在最后一个斜杠之后附加的 g 选项告诉 sed 执行全局替换.
关于 s/// 替换命令,还有其它几件要了解的事.首先,它是一个命令,并且只是一个命令,在所有上例中都没有指定地址.这意味着,s/// 还可以与地址一起使用来控制要将命令应用到哪些行,如下所示:
$ sed -e 1,10s/enchantment/entrapment/g myfile2.txt上例将导致用短语 entrapment 替换所有出现的短语 enchantment,但是只在第一到第十行(包括这两行)上这样做.
$ sed -e /^$/,/^end/s/hills/mountains/g myfile3.txt该例将用 mountains 替换 hills,但是,只从空行开始,到以三个字符 end 开始的行结束(包括这两行)的文本块上这样做.
关于 s/// 命令的另一个妙处是 / 分隔符有许多替换选项.如果正在执行字符串替换,并且规则表达式或替换字符串中有许多斜杠,则可以通过在 s 之后指定一个不同的字符来更改分隔符.例如,下例将把所有出现的 /usr/local 替换成 /usr:
$ sed -e s:/usr/local:/usr:g mylist.txt在该例中,使用冒号作为分隔符.如果需要在规则表达式中指定分隔符字符,可以在它前面加入反斜杠.
规则表达式混乱
目前为止,我们只执行了简单的字符串替换.虽然这很方便,但是我们还可以匹配规则表达式.... 下一页