在 Linux 系统里,有个超厉害的文本处理工具叫 sed 命令。它就像是一把功能强大的瑞士军刀,能对文本进行各种各样的操作,比如批量替换文本内容、删除特定的行等等。下面就来详细给大家讲讲怎么用这个神器。

一、sed 命令基础介绍

sed 的全称是 Stream Editor,也就是流编辑器。它可以对输入的文本进行逐行处理,然后输出处理后的结果。基本语法是:

# 技术栈:Shell
sed [选项] '命令' 文件名

这里的选项有很多,不同的选项能让 sed 实现不同的功能;命令就是我们要对文本执行的具体操作;文件名就是我们要处理的文件。

举个例子,有一个文件叫 test.txt,内容如下:

hello world
hello sed

我们想把里面所有的“hello”替换成“hi”,可以这样用 sed 命令:

# 技术栈:Shell
sed 's/hello/hi/g' test.txt

这里的“s”是替换命令,“/hello/hi/”表示把“hello”替换成“hi”,“g”是全局替换的意思,也就是一行里如果有多个“hello”,都会被替换成“hi”。执行这个命令后,输出结果就是:

hi world
hi sed

二、批量替换文本内容实操

2.1 简单替换

上面那个例子就是简单的替换,不过它只是把结果输出到屏幕上,并没有修改原文件。如果想直接修改原文件,可以加上“-i”选项,就像这样:

# 技术栈:Shell
sed -i 's/hello/hi/g' test.txt

执行这个命令后,test.txt 文件里的“hello”就真的都变成“hi”了。

2.2 替换特定文本段

有时候我们不是要替换整个单词,而是要替换一段文本。比如有个文件 content.txt,内容如下:

The price is $100.
The cost is $200.

我们想把里面的价格部分(就是美元符号和数字)都替换成“unknown”,可以这样写:

# 技术栈:Shell
sed -i 's/\$[0-9]\+/unknown/g' content.txt

这里的“$”是美元符号,因为美元符号在正则表达式里有特殊意义,所以要用“\”来转义;“[0-9]”表示匹配数字,“+”表示匹配一个或多个前面的字符,也就是匹配一个或多个数字。执行这个命令后,content.txt 文件的内容就变成:

The price is unknown.
The cost is unknown.

2.3 多文件批量替换

如果有多个文件都要进行相同的替换操作,也很简单。比如有 test1.txt、test2.txt、test3.txt 这三个文件,都要把“apple”替换成“banana”,可以这样:

# 技术栈:Shell
sed -i 's/apple/banana/g' test*.txt

这里的“”是通配符,表示匹配任意字符,所以“test.txt”就表示所有以“test”开头,以“.txt”结尾的文件。

三、删除行实操

3.1 删除指定行

还是以 test.txt 文件为例,假如它的内容是:

line 1
line 2
line 3

我们想删除第二行,可以这样用 sed 命令:

# 技术栈:Shell
sed '2d' test.txt

这里的“2”表示第二行,“d”是删除命令。执行这个命令后,输出结果就是:

line 1
line 3

如果要直接修改原文件,同样加上“-i”选项就行:

# 技术栈:Shell
sed -i '2d' test.txt

3.2 删除多行

如果要删除连续的多行,比如删除第二行到第三行,可以这样:

# 技术栈:Shell
sed '2,3d' test.txt

这里的“2,3”表示从第二行到第三行。执行这个命令后,输出结果就是:

line 1

要是想删除不连续的多行,比如删除第一行和第三行,可以这样:

# 技术栈:Shell
sed '1d;3d' test.txt

这里用分号“;”把两个删除命令隔开。

3.3 根据内容删除行

有时候我们想根据行的内容来删除行。比如有个文件 info.txt,内容如下:

apple
banana
cherry

我们想删除包含“banana”的行,可以这样:

# 技术栈:Shell
sed '/banana/d' info.txt

这里的“/banana/”表示匹配包含“banana”的行,“d”是删除命令。执行这个命令后,输出结果就是:

apple
cherry

四、应用场景

4.1 配置文件修改

在 Linux 系统里,很多服务的配置文件都是文本形式的。比如 Nginx 的配置文件,当我们需要修改里面的一些参数时,就可以用 sed 命令进行批量替换。假如有个 Nginx 配置文件 nginx.conf,里面有很多地方都配置了监听端口 80,现在要把这些端口都改成 8080,就可以这样:

# 技术栈:Shell
sed -i 's/listen 80/listen 8080/g' nginx.conf

4.2 日志文件处理

在处理日志文件时,有时候我们会发现一些无用的信息,比如某些特定格式的日志行。这时候就可以用 sed 命令把这些行删除。比如有个日志文件 access.log,里面有很多包含“INFO”的日志行,我们觉得这些信息没用,想把它们都删除,就可以这样:

# 技术栈:Shell
sed -i '/INFO/d' access.log

五、技术优缺点

5.1 优点

  • 强大的文本处理能力:sed 命令可以对文本进行各种复杂的操作,比如替换、删除、插入等,而且支持正则表达式,能满足很多不同的需求。
  • 高效:sed 是逐行处理文本的,不需要把整个文件都加载到内存里,所以处理大文件时也很高效。
  • 简单易用:命令语法相对简单,容易上手,即使是初学者也能很快掌握基本的用法。

5.2 缺点

  • 功能相对单一:sed 主要是针对文本处理的,对于一些复杂的数据处理和分析任务,可能就不太适用了。
  • 学习曲线:虽然基本用法简单,但要掌握一些高级的用法,比如复杂的正则表达式和脚本编写,还是需要花一些时间去学习的。

六、注意事项

6.1 备份文件

在使用 sed 命令直接修改原文件(加“-i”选项)时,一定要先备份文件。因为一旦操作失误,原文件的内容就会被修改,可能会造成不可挽回的损失。可以这样备份:

# 技术栈:Shell
cp test.txt test_backup.txt

6.2 正则表达式转义

在使用正则表达式时,要注意特殊字符的转义。比如美元符号“$”、点号“.”等,在正则表达式里都有特殊意义,如果要匹配它们本身,就需要用“\”来转义。

6.3 编码问题

不同的文件可能有不同的编码格式,比如 UTF-8、GBK 等。在处理文件时,要确保 sed 命令能正确识别文件的编码,否则可能会出现乱码的问题。

七、文章总结

通过这篇文章,我们详细介绍了 sed 命令在批量替换文本内容和删除行方面的使用方法。从基础的替换和删除操作,到多文件的批量处理,再到根据内容进行操作,相信大家对 sed 命令有了更深入的了解。同时,我们也介绍了 sed 命令的应用场景、优缺点和注意事项。在实际工作中,如果遇到文本处理的问题,不妨试试 sed 命令,它可能会给你带来意想不到的便利。