4.8 替换文本或文件中的字符串
字符串替换是常见的文本处理任务。通过利用正则表达式匹配所需要的文本,就可以轻松完成该任务。
4.8.1 预备知识
一听到“替换”这个词,所有系统管理员大概都会想到sed
。sed
是类UNIX系统下用于文本或文件内容替换的通用工具。让我们看看如何使用sed
。
4.8.2 实战演练
在4.6节中已经介绍了sed
的大多数用法。你可以利用下面的方式替换一个字符串或样式:
- $ sed 's/PATTERN/replace_text/g' filename
或者
- $ stdin | sed 's/PATTERN/replace_text/g'
也可以用双引号("
)代替单引号('
)。当使用双引号时,我们可以在sed
样式和替换字符串中指定变量。例如:
- $ p=pattern
- $ r=replaced
- $ echo "line containing a pattern" | sed "s/$p/$r/g"
- line containing a replaced
在sed
中,我们也可以不使用g
。
- $ sed 's/PATTERN/replace_text/' filename
这条命令会替换PATTERN
匹配的第一处内容。/g
意为全局(global),这就意味着它会替换文件中所有匹配PATTERN
的内容。
4.8.3 补充内容
我们已经看过了用sed
进行文本替换的基本用法。接下来看一看如何将替换过的文本保存到原文件中。
将替换结果保存到文件中
当文件名传递给sed
时,sed
会将输出写入stdout
。如果不想将输出传送至stdout
,而是将更改保存到文件中,那么可以使用 -i
选项:
- $ sed 's/PATTERN/replacement/' -i filename
例如,用另一个指定的数字替换文件中所有的3位数字:
- $ cat sed_data.txt
- 11 abc 111 this 9 file contains 111 11 88 numbers 0000
- $ cat sed_data.txt | sed 's/\b[0-9]\{3\}\b/NUMBER/g'
- 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
命令。