sed
是 Linux 中的一个流编辑器(stream editor),主要用于处理文本的编辑和转换。它可以从文件或标准输入读取内容,然后根据指定的模式和指令对数据进行处理,最后输出修改后的结果。它的强大之处在于可以通过脚本或命令行进行非交互式的文本处理。
sed
的基本语法
sed [选项] '脚本' 文件
脚本
:描述如何编辑文本的操作。文件
:需要处理的文本文件。选项
:控制sed
的行为,常用选项如下。
常用选项
-e
:允许使用多个编辑脚本。-i
:直接修改文件(原地编辑)。-n
:静默模式,不会自动打印输出,通常与p
命令结合使用。-r
:使用扩展正则表达式。-f
:从脚本文件读取sed
命令。
常见命令
p
:打印匹配的行。d
:删除匹配的行。s
:替换模式(substitute)。a
:在当前行之后追加文本。i
:在当前行之前插入文本。c
:用新的文本替换整行。
示例详解
1. 基本替换
bash
sed 's/old/new/' file.txt
s/old/new/
:将每行中第一个匹配old
的字符串替换为new
。- 如果需要替换每行中所有匹配的字符串,可以使用
g
选项:
bash
sed 's/old/new/g' file.txt
2. 只修改特定行
bash
sed '2s/old/new/' file.txt
- 只对文件的第二行进行替换操作。
3. 删除行
bash
sed '2d' file.txt
- 删除第二行。
bash
sed '2,5d' file.txt
- 删除第 2 到第 5 行。
4. 插入和追加
bash
sed '2a\This is new line' file.txt
- 在第二行后插入文本
This is new line
。
bash
sed '2i\This is new line' file.txt
- 在第二行前插入文本
This is new line
。
5. 多脚本处理
使用 -e
选项可以进行多个命令的组合:
bash
sed -e 's/old/new/' -e '2d' file.txt
- 首先将所有
old
替换为new
,然后删除第二行。
6. 扩展正则表达式
默认情况下,sed
使用基本正则表达式。要使用扩展正则表达式,可以加上 -r
选项:
bash
sed -r 's/(foo|bar)/new/' file.txt
- 将
foo
或bar
替换为new
。
7. 原地修改文件
bash
sed -i 's/old/new/g' file.txt
- 直接修改
file.txt
,不再输出到标准输出。
8. 打印匹配行
结合 -n
和 p
命令,只输出匹配的行:
bash
sed -n '/pattern/p' file.txt
- 只打印匹配
pattern
的行。
高级用法
1. 使用 &
引用匹配部分
在替换操作中,&
代表匹配的部分:
bash
sed 's/[0-9]\+/[&]/g' file.txt
- 将文件中所有的数字用方括号包裹起来。
2. 使用标记捕获组
bash
sed 's/\(old\)/new\1/' file.txt
- 将匹配的
old
替换为newold
,\1
表示引用第一个捕获组。
3. 替换多行文本
bash
sed ':a;N;$!ba;s/\n/ /g' file.txt
- 将整个文件的所有换行符替换为空格,从而将整个文件内容变成一行。
总结
sed
是处理文本的强大工具,适用于各种文本处理任务。通过合理利用正则表达式、脚本和命令选项,可以实现从简单的查找替换到复杂的文本编辑任务。