shell 三剑客之 sed

背景

sed(Stream Editor 流编辑器),作为三剑客的一份子,主要的功能有增删改查。为什么称之为“流”编辑器呢?大家知道:在 Linux 文件系统中,一切都可以作为文件来处理,比如:配置文件、设备文件、日志等等。sed 就类似于工厂流水线作业的车间一样,文件中的每行内容都是生产元件,经过 sed 车间流水线处理,最终会变成成品。

sed 语法格式

同 grep 一样,sed 提供两种方式:

第一种是从文本中直接使用 pattern 匹配搜索
第二种是从标准输出中处理

语法格式 解释
option 选项
pattern 匹配到对应的内容(找谁?)
command 执行操作/命令,增删改查等(做啥?)

选项

选项 含义
-n 只打印模式匹配的行
-e 指定对应的模式命令,如果只要一个不需要指定
-r 在模式中使用扩展正则表达式
-i 直接修改文件内容

pattern 匹配模式

匹配模式 含义
10 command 匹配到第 10 行
10,20 command 匹配从第 10 行开始,到第 20 行结束
/pattern1/ command 匹配到 pattern1 的行
/pattern1/,/pattern2/ command 匹配到 pattern1 的行开始,到匹配到 pattern2 的行结束
10,/pattern1/ command 匹配到从 d 第 10 行开始,到匹配到 pattern1 的行结束
/patttern1/,10 command 匹配到 pattern1 的行开始,到第 10 行匹配结束

sed 命令-增加&删除

类别 编辑命令 含义
增加 a 行后追加(append)
增加 i 行前追加(insert)
删除 d 删除

练习:
单行插入

sed '5a lemonban' test.txt

多行插入

# \n表示换行符 
sed '5i hello\nlemonban' test.txt

删除内容

#删除文件所有内容(不指定匹配模式,默认会匹配到所有行)
sed 'd' test.txt 
#删除文件第二行内容
sed '2d' test.txt 

sed 命令-修改

类别 编辑命令 含义
修改 s#old#new# 将行内第一个 old 替换为 new
修改 s#old#new#g 将行内全部的 old 替换为 new

练习:
修改文件内容,不对源文件起效

#将文件中的lemonban替换成lemon
sed 's#lemonban#lemon#g' person.txt 

修改源文件内容

#将文件中的lemonban替换成lemon
sed -i 's#lemonban#lemon#g' person.txt 

修改文件指定行对应的内容

#将文件中第二行的lemonban替换成lemon
sed -i '2s#lemonban#lemon#g' person.txt 

sed 分组替换功能

正则表达式中的分组功能 sed 也是可以支持的,用()记住正则表达式的一部分,其中,\1 为第一个小括号里面的内容,如果还有其他的下括号,那么\2 即可第二个,以此类推...,最多记住 9 个。
实例:
I am yy teacher.这串文本想要保留 yy,删除剩余的部分

echo "I am yy teacher." | sed -r 's#I am ([a-z]+) teacher.#\1#g'

给配置文件中某一项配置加注释

sed -r 's#(^test)#\#\1#' file

sed 命令-查询

查询相比较是最简单的,sed 中的查询相比 cat、more 命令可以更加精细,例如:
查询文件第二行内容(p 即表示查询)

sed -n '2p' test.txt

查询文件 1-10 行

sed -n '1,10p' test.txt

注意:p 查询命令需要和-n 参数结合一起使用,如果不使用-n 会输出原来行内容及匹配行的内容,-n 表示取消原来行输出

综合实例

用 sed 取出 Linux 网卡 eth0 的 IP 地址

ifconfig eth0 | sed -rn '2s#^.*addr:(.*) Bcast:.*$#\1#gp'

将/etc/passwd 文件中非单词字符替换成空格

sed -r 's#[^a-zA-Z]+# #g' /etc/passwd

问题?使用单引号 or 双引号区别?

1 操作
shakebabe 在 2020-08-06 17:37:09 更新了该帖
4 回帖
请输入回帖内容 ...