使用 sed
处理文本
1. sed命令的语法
什么是sed
?
sed
(Stream Editor的缩写,即流编辑器)是一个强大的文本处理工具,它可以修改、添加、删除或转换文本文件和数据流中的行。
sed
的主要魔力在于它可以“即时”编辑文本,而不会影响原始文件(除非你特意要求这样)。这使它成为快速和自动化处理数据的理想工具。
命令的基本语法
我们来看一下使用sed
的基本公式:
sed [选项] '模式/操作' 文件
其中:
模式
— 要搜索的文本或正则表达式。操作
— 你希望执行的操作(例如文本替换)。文件
— 包含你想要修改的行的文本文件。
为了简单起见,一开始我们会专注于最流行的操作:替换文本(s
—— 源于“substitute”)和删除行(d
—— 源于“delete”)。
2. 替换文本 s/旧的/新的/
示例 1: 简单的文本替换
假设我们有一个文件 example.txt
,内容如下:
Hello world!
Welcome to Linux.
Linux is awesome.
试着把 "Linux" 替换为 sed
:
sed 's/Linux/sed/' example.txt
输出会是这样的:
Hello world!
Welcome to sed.
sed is awesome.
就是这样。单词 "Linux" 在每行中仅被替换了一次。这是默认行为。
示例 2: 全局替换
如果需要替换所有出现的单词而不是每行的第一个,请添加标记 g
(全局):
sed 's/Linux/sed/g' example.txt
如果某一行中有多个 "Linux",它们都会被替换为 sed
。
示例 3: 忽略大小写
为了替换文本时忽略大小写,请添加标记 I
(或根据版本使用 i
):
sed 's/linux/sed/gi' example.txt
这会替换单词 "Linux"、"LINUX"、"LiNuX" 等等。
示例 4: 替换并保存结果
默认情况下 sed
只是将结果打印到控制台,并不会修改文件。如果想将更改保存到文件中,请添加选项 -i
(in-place):
sed -i 's/Linux/sed/g' example.txt
现在文件 example.txt
就会更新为替换后的内容。
3. 删除行 /模式/d
示例 1: 根据模式删除行
如果你想删除所有包含 "Linux" 字样的行:
sed '/Linux/d' example.txt
输出结果如下:
Hello world!
这里删除了包含 "Linux" 的行。
根据行号删除
你可以根据行号删除一行。例如,要删除第二行,可以这样用:
sed '2d' example.txt
输出结果:
Hello world!
Linux is awesome.
删除多行: 指定一个范围,比如要删除第 2 到第 3 行:
sed '2,3d' example.txt
4. 正则表达式的使用
这正是sed
展现其强大的地方!可以在模式中使用正则表达式来搜索更复杂的匹配项。
例子 1:替换符合某种模式的单词
假设文本中有以下行:
error: something went wrong
warning: check your system
error: unable to connect
我们想把所有以"error"开头的行替换为"Issue Detected"。正则表达式可以帮助我们完成这件事:
sed 's/^error:.*/Issue Detected/' logs.txt
解释如下:
^
— 表示行的开始。.*
— 意味着"后面可以是任何内容"。
结果:
Issue Detected
warning: check your system
Issue Detected
5. 插入和添加行
在匹配项前插入一行
要在每一行包含 "Linux" 的行前插入一行:
sed '/Linux/i\# 学习让人快乐' example.txt
结果:
Hello world!
Welcome to Linux.
# 学习让人快乐
Linux is awesome.
示例 2: 在匹配项后添加一行
在匹配到的行后添加文本:
sed '/Linux/a\# sed 让一切更简单' example.txt
结果:
Hello world!
Welcome to Linux.
# sed 让一切更简单
Linux is awesome.
# sed 让一切更简单
6. 实践:处理配置文件
我们来解决一个实际问题。假设你有一个配置文件 config.txt
:
host=localhost
port=8080
mode=production
logfile=/var/log/app.log
任务 1:将"localhost"替换为"127.0.0.1"
sed -i 's/localhost/127.0.0.1/' config.txt
结果:
host=127.0.0.1
port=8080
mode=production
logfile=/var/log/app.log
任务 2:将端口号增加1
为此,可以借助sed
的小技巧:
sed -i 's/port=8080/port=8081/' config.txt
结果:
host=127.0.0.1
port=8081
mode=production
logfile=/var/log/app.log
任务 3:删除含有logfile
的行
如果配置文件不再需要日志记录,可以删除这一行:
sed -i '/logfile/d' config.txt
结果:
host=127.0.0.1
port=8081
mode=production
7. 与其他命令组合
sed
和其他 Linux 工具搭配时表现很棒。比如:
grep "error" logs.txt | sed 's/error/ERROR/'
这里我们先查找包含错误的行,然后格式化它们。
常见错误及如何避免
- 错误: 忘记了选项
-i
。 新手经常期望sed
会修改文件,但却没有加上-i
。如果你想修改文件,记得明确指定这个选项。 - 错误: 引号问题。 在某些系统中,尤其是使用单引号时,
\
在特殊字符前可能无法正确处理。记得正确转义字符。 - 错误: 行范围问题。 如果你在使用范围(例如
2,3d
),请确保设置正确——文件不能为空。
GO TO FULL VERSION