4.8 替换文本或文件中的字符串

字符串替换是常见的文本处理任务。通过利用正则表达式匹配所需要的文本,就可以轻松完成该任务。

4.8.1 预备知识

一听到“替换”这个词,所有系统管理员大概都会想到sedsed是类UNIX系统下用于文本或文件内容替换的通用工具。让我们看看如何使用sed

4.8.2 实战演练

在4.6节中已经介绍了sed的大多数用法。你可以利用下面的方式替换一个字符串或样式:

  1. $ sed 's/PATTERN/replace_text/g' filename

或者

  1. $ stdin | sed 's/PATTERN/replace_text/g'

也可以用双引号(")代替单引号(')。当使用双引号时,我们可以在sed样式和替换字符串中指定变量。例如:

  1. $ p=pattern
  2. $ r=replaced
  3. $ echo "line containing a pattern" | sed "s/$p/$r/g"
  4. line containing a replaced

sed中,我们也可以不使用g

  1. $ sed 's/PATTERN/replace_text/' filename

这条命令会替换PATTERN匹配的第一处内容。/g意为全局(global),这就意味着它会替换文件中所有匹配PATTERN的内容。

4.8.3 补充内容

我们已经看过了用sed进行文本替换的基本用法。接下来看一看如何将替换过的文本保存到原文件中。

将替换结果保存到文件中

当文件名传递给sed时,sed会将输出写入stdout。如果不想将输出传送至stdout,而是将更改保存到文件中,那么可以使用 -i选项:

  1. $ sed 's/PATTERN/replacement/' -i filename

例如,用另一个指定的数字替换文件中所有的3位数字:

  1. $ cat sed_data.txt
  2. 11 abc 111 this 9 file contains 111 11 88 numbers 0000
  3.  
  4. $ cat sed_data.txt | sed 's/\b[0-9]\{3\}\b/NUMBER/g'
  5. 11 abc NUMBER this 9 file contains NUMBER 11 88 numbers 0000

上面的单行命令只替换3位数字。\b[0-9]{3}\b是一个用于匹配3位数字的正则表达式。[0-9] 表示从0到9的数字范围。{3} 用来匹配3次之前的数字。{3} 中的 \ 用于赋予{和}特殊的含义。\b 是单词边界标记。

4.8.4 参考

4.6节中讲解了sed命令。