Linux中最重要的三个命令在业界被称为“三剑客”,它们是awk,sed,grep
sed 是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。
整理不易,如需转发请注明出处
终端输入sed --help可以看到所有的语法参数,翻译了部分,举例一些常用的实例
一、参数说明
-e :直接在命令行模式上进行sed动作编辑,此为默认选项;
-e允许在同一行里执行多条命令,删除1行,第二条命令用start替换shutdown
[root@master ~]# sed -e '1d' -e 's//start/' passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
start:x:6:0:shutdown:/sbin:/sbin/shutdown
-f :将sed的动作写在一个文件内,用–f filename 执行filename内的sed动作;
-i :直接修改文件内容;
直接删除passwd的root行,-i参数是直接可以修改文件那日容的
[root@master ~]# sed -i '1d' passwd
[root@master ~]# cat passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
-n :只打印模式匹配的行;
打印第一行内容
[root@master ~]# sed -n 1p passwd
root:x:0:0:root:/root:/bin/bash
-r :支持扩展表达式;
-h或--help:显示帮助;
-V或--version:显示版本信息。
二、sed常用参数:
a :新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~
在第一行下面插入yunwei
[root@master ~]# sed '1a yunwei' passwd
root:x:0:0:root:/root:/bin/bash
yunwei
bin:x:1:1:bin:/bin:/sbin/nologin
c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
替换第二行内容
[root@master ~]# sed '2c yunwei' passwd
root:x:0:0:root:/root:/bin/bash
yunwei
d :删除,因为是删除,所以 d 后面通常不接任何文本;
删除第一行root
[root@master ~]# sed 1d passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
在第一行和第二行中间插入yunwei
[root@master ~]# sed '2i yunwei' passwd
root:x:0:0:root:/root:/bin/bash
yunwei
bin:x:1:1:bin:/bin:/sbin/nologin
p :列印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
打印第一行和第二行的内容
[root@master ~]# sed -n '1,2p' passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
s :取代,可以直接进行取代,通常这个 s 的动作可以搭配正规表示法
把文中的root替换成toor,s/root/toor/g后面添加上g就是全部都替换
[root@master ~]# sed 's/root/toor/' passwd
toor:x:0:0:root:/root:/bin/bash
h :拷贝模板块的内容到内存中的缓冲区;
H :追加模板块的内容到内存中的缓冲区;
g :获得内存缓冲区的内容,并替代当前模板块中的文本;
G :获得内存缓冲区的内容,并追加到当前模板块文本的后面;
这是sed一些高级用法,目前用到的不是特别多,都是组合起来使用,以下实例把passwd内容以倒序的方式展现出来,类似于tac passwd
[root@master ~]# sed '1!G;h;$!d' passwd
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
sync:x:5:0:sync:/sbin:/bin/sync
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
bin:x:1:1:bin:/bin:/sbin/nologin
root:x:0:0:root:/root:/bin/bashg G 复制/附加保持空间的内容到模式空间
h H 复制/附加模式空间的内容到保持空间
执行第一行,保存第一行保持空间,清除模式空间
执行第二行,保存第二行+第一行到保持空间,清除模式空间
执行第三行,保存第三行+第二行+第一行到保持空间,清除模式空间
l :列表不能打印字符的清单;
n :读取下一个输入行,用下一个命令处理新的行而不是用第一个命令;
n和N是sed高级用法,读取到匹配行后添加自定义的文本,以下实例可以很好理解
[root@master ~]# sed 'N;asong' passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
song
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
song
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
song
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown解释:
读取1进模式空间
执行命令N
读取2并附加到模式空间,当前模式空间内容为“1\n2”
执行命令a—
在模式空间后附加一行‘—’当前模式空间内容为“1\n2\n—"
打印模式空间内容
循环执行直到读取11进模式空间,11的具体过程如下
读取11进模式空间
执行命令N,不过读取不到下一行
因为读不到,所以sed退出所有的命令,也就是说它不会执行命令a
加回换行符并打印模式空间的内容到输出,当前模式空间内容为11,所以输出11
已经是文件尾,sed结束运行。
N :追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码;
r :在文件的匹配行之后插入另外一个文件的内容
意思是我查找passwd一个关键字yunwei,系统找到然后插入另外一个文件的内容,看实例就明白了
[root@master ~]# sed '/shutdown/r /root/pom.xml' passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.6.RELEASE</version>
<relativePath/> <!-- lookup parent from repository -->
</parent>
三、匹配字符
^ 锚定行的开始. 如/^sed/ 匹配所有以sed开头的行
$ 锚定行的结束. 如/sed$/ 匹配所有以sed结尾的行
. 匹配一个非换行符. 如/*sed/ 匹配s后接一个任意字符然后是d
* 匹配零或多个字符. 如/*sed/ 匹配所有模块是一个或多个空格后紧跟sed的行
[] 匹配一个制定范围内的字符如. /[Ss]ed/ 匹配sed和Sed
[^] 匹配一个不在制定范围内的字符. 如/[^A-RT-Z]ed/ 匹配不包含A-R和T-Z的一个字母开头,紧跟ed的行
\(..\) 保存匹配的字符. 如s/\(love\)able/\1rs loveable被替换成lovers
& 保存搜索字符用来替换其它字符. 如s/love/**&**/ love这成**love**
\< 锚定单词的开始. 如/\\> 锚定单词的结束. 如/love\>匹配包含以love结尾的单词行
x\{m\} 重复字符x,m次. 如/o\{5\}匹配包含5个o的行
x\{m,\} 重复字符x,至少m次. 如 /o\{5,}/匹配至少有5个o的行
x\{m,n\} 重复字符x,至少m次.把多余n次. 如 /o\{5,10\}/匹配5-10个o的行
四、补充
删除: dd命令
sed '2d' passwd 删除passwd文件的第2行
sed '2,$d' passwd 删除passwd文件的第2行到末尾所有行
sed '$d' passwd 删除passwd文件的最后一行
sed '/nologin/'d passwd 删除passwd文件所有包含nologin的行
sed d passwd 删除passwd文件中的所有行
sed 2,5d passwd 删除passwd中的2-5行
sed /nologin/d passwd 删除passwd中包含字符串nologin所有的行
选定行的范围: 逗号
ssed -n '/login/,/nologin/p' passwd 所有在模块login和nologin所确定范围内的行都被打印