0. 原文迁移
linux shell之sed
:https://blog.csdn.net/iflink/article/details/122388791
目录
sed
(Stream Editor)是一款强大流式、非交互式的编辑器,集合正则表达式,可以对标准输出或者其他输出进行处理并输出。
sed
的强项是替换文本中的特定字符,而写
shell
有个步骤就是从一段文本中截取一段字符进行处理,所以熟练掌握
sed
命令是写
shell
脚本的基本技能。
sed
主要是用来将数据进行选取、替换、删除、新増。
1. 概述
1.1 工作原理
对指定输入流数据,sed
是顺序逐行进行处理,具体处理流程如下:
- 从指定输入读入一行数据,存入
模式空间
(Pattern Space)临时缓冲区; - 按照指定sed编辑命令处理缓冲区的内容;
- 移除缓冲区内容,并将其输出;
- 直到处理完所有内容。
1.2 与vim的区别
vim
需要通知处理文件哪几行才会去处理,sed
默认会处理文件的所有行,除非你告诉它不处理哪几行。
2. 基本语法
sed
进行的操作,并不会直接改变原文件内容,而是把修改结果只显示到屏幕上,除非使用-i
选项才会对原文件内容进行修改。
sed [option] [commands] [inputfile]
2.1 选项
option | 描述 |
---|---|
-n | 一般情况下,sed 命令会把所有数据都输出到屏幕上。如果加入此选项,则只会把经过sed 命令处理的行输出到屏幕上 |
-e | 允许对输入数据应用多条sed 命令编辑 |
-f | 脚本文件名:从sed 脚本中读入sed 操作。和 awk 命令的-f 选项非常类似 |
-r | 在sed 中支持扩展正则表达式 |
-i | 用sed 的修改结果直接修改读取数据的文件,而不是由屏幕输出动作 |
a \ | 行追加,在当前行后添加一行或多行。当添加多行时,除最后一行外,每行末尾需要用“\”代表数据未完结 |
c \ | 行替换,用c 后面的字符串替换原数据行。当替换多行时,除最后一行外,每行末尾需用“\”代表数据未完结 |
i \ | 行插入,在当前行前插入一行或多行。当插入多行时,除最后一行外,每行末尾需要用“\”代表数据未完结 |
d | 行删除,删除指定的行 |
p | 行打印,输出指定的行 |
s | 字符串替换,用一个字符串替换另一个字符串。格式为:s/旧字串/新字串/g |
2.2 示例
2.2.1 多行删除
删除指定1~5
行数据之后输出,包括1
和5
行,注意不会修改原文件内容
。
[root@master-zeus ~]# cat /etc/passwd | sed -e "1,5d"
2.2.2 正则匹配
删除正则匹配的行,如果匹配就执行命令p
(即,打印)。其中,命令-n告知sed不需要每行执行输出,根据后面命令进行处理。
[root@master-zeus ~]# cat /etc/passwd | sed -n -e "/root/p"
2.2.2 正则块匹配
从第一个正则匹配开始,到第二个正则匹配结束的所有行,然后执行命令p
。注意,均包含开始和结束匹配行
[root@master-zeus ~]# cat /etc/passwd | sed -n -e "/begin/,/end/p"
2.2.3 替换
指定范围是1~20
行,执行root
全局替换为admin
之后打印到屏幕。
[root@master-zeus ~]# cat /etc/passwd | sed -n -e "1,20s/root/admin/gp"
admin:*:0:0:System Administrator:/var/admin:/bin/sh
daemon:*:1:1:System Services:/var/admin:/usr/bin/false
如果数据包含/
,那么可以重新指定分隔符,下列将分隔符指定为:
。
[root@master-zeus ~]# echo "/usr/local/bin" \| sed -n -e "s:/usr/local:/usr:gp"
/usr/bin
2.3 组合命令
2.3.1 组合多条命令
命令=
表示打印行号,命令p
表示打印,用分号(;
)分开串行处理。
[root@master-zeus ~]# sed -n -e "=;p" /etc/passwd
2.3.1 地址范围操作多条命令
地址范围为1~20
行,执行命令包括:sbin/nologin
全局替换为bin/zsh
,:
全局替换为|
[root@master-zeus ~]# sed -n -e "1,20{s:sbin/nologin:bin/zsh:g;s/:/|/g;p}" /etc/passwd