sed
是一个强大的文本处理工具,用于流编辑(Stream Editor),能够在文本流中执行编辑操作,如查找和替换、删除行、插入内容等。它非常适合对大文件或多行文本进行批量操作。sed
的工作模式是读取输入、处理文本、输出结果。
基本语法
sed [选项] '操作' 文件名
- 选项:
sed
提供了多个选项用于控制操作行为(如是否直接修改文件等)。 - 操作:对文本进行的具体操作,如查找、替换、删除等。
- 文件名:要处理的文本文件。
1. 常见选项
-n
:抑制默认输出,只输出处理后的内容(单词缩写:no-output)。-e
:允许使用多个sed
操作(链式执行)(单词缩写:expression)。-i
:直接修改文件而不将结果输出到标准输出(单词缩写:in-place 就地,原地)。-r
:使用扩展正则表达式(ERE),而不是基本正则表达式(BRE)(单词缩写:regular-exprerssion)。-f
:从指定文件中读取sed
脚本(单词缩写:file)。
2. 常见操作
2.1. 替换操作
- 语法:
s/模式/替换文本/标志
sed 's/old/new/' file.txt
- 作用:将
file.txt
文件中的第一个匹配old
的字符串替换为new
。 - 标志:
/g
:全局替换(替换每一行中的所有匹配项)(global)。/i
:忽略大小写(ignore case)。
示例:
-
替换每行中第一个
apple
为orange
:sed 's/apple/orange/' file.txt
-
替换每行中的所有
apple
为orange
:sed 's/apple/orange/g' file.txt
-
忽略大小写进行替换:
sed 's/apple/orange/gi' file.txt
2.2. 删除行
- 语法:
N d
(其中 N 为行号)
sed '2d' file.txt
- 作用:删除文件
file.txt
中的第 2 行。
示例:
-
删除第 3 行:
sed '3d' file.txt
-
删除第 1 至第 5 行:
sed '1,5d' file.txt
-
删除所有包含特定模式的行(如删除包含
apple
的行):sed '/apple/d' file.txt
2.3. 打印特定行
- 语法:
N p
或/模式/ p
sed -n '3p' file.txt
- 作用:打印
file.txt
文件中的第 3 行(使用-n
选项抑制默认输出,只输出指定行)。
示例:
-
打印文件的第 1 到第 5 行:
sed -n '1,5p' file.txt
-
打印包含
apple
的行:sed -n '/apple/p' file.txt
2.4. 插入/追加文本
-
插入行:在指定行之前插入文本。
sed '2i\This is an inserted line' file.txt
- 作用:在第 2 行之前插入
This is an inserted line
。
- 作用:在第 2 行之前插入
-
追加行:在指定行之后追加文本。
sed '3a\This is an appended line' file.txt
- 作用:在第 3 行之后添加
This is an appended line
。
- 作用:在第 3 行之后添加
2.5. 替换特定行
sed '3s/old/new/' file.txt
- 作用:只替换第 3 行中的
old
为new
。
2.6. 多重编辑
使用 -e
选项或用分号 ;
来分隔多个 sed
命令。
sed -e 's/old/new/' -e 's/foo/bar/' file.txt
或者:
sed 's/old/new/; s/foo/bar/' file.txt
- 作用:在
file.txt
中,首先将old
替换为new
,然后将foo
替换为bar
。
3. 高级用法
3.1. 使用正则表达式
sed
支持正则表达式,可以用来处理更复杂的文本操作。
-
匹配多个字符替换:
sed 's/[0-9]/#/g' file.txt
- 作用:将所有数字替换为
#
。
- 作用:将所有数字替换为
-
匹配任意字母:
sed 's/[a-zA-Z]/*/g' file.txt
- 作用:将所有字母替换为
*
。
- 作用:将所有字母替换为
3.2. 以行为单位的范围操作
sed
支持指定行范围的操作。
-
替换第 2 到第 4 行中的文本:
sed '2,4s/foo/bar/' file.txt
-
删除第 5 到最后一行的文本:
sed '5,$d' file.txt
3.3. 使用文件作为输入
如果你有大量的 sed
脚本或复杂的逻辑,可以将这些命令放在一个文件中,然后使用 -f
选项运行。
sed -f script.sed file.txt
- script.sed 文件示例:
s/foo/bar/g 2d /apple/d
4. 修改文件的内容(-i
选项)
- 语法:
sed -i '操作' 文件名
sed -i 's/old/new/g' file.txt
-
作用:直接在文件
file.txt
中进行替换操作,而不输出到终端。这种方式修改文件后不会保留备份。 -
保留备份:
sed -i.bak 's/old/new/g' file.txt
- 作用:在修改文件前,生成
file.txt.bak
作为备份。
- 作用:在修改文件前,生成
5. 常见操作汇总
-
查找并替换(全局):
sed 's/old/new/g' file.txt
-
删除包含某个模式的行:
sed '/pattern/d' file.txt
-
打印特定行范围:
sed -n '10,20p' file.txt
-
插入文本:
sed '3i\This is an inserted line' file.txt
-
直接修改文件内容:
sed -i 's/old/new/' file.txt
总结
sed
是一个非常灵活的工具,它的主要用途是查找和替换、删除或修改文本中的某些内容。通过结合正则表达式和行范围,它可以完成非常复杂的文本操作。