sed

sed

sed [options] '[地址定界] command' file(s)

options:
 -n:不输出模式空间内容到屏幕,即不自动打印,只打印匹配到的行
 -e:多点编辑,对每行处理时,可以有多个Script
 -f:把Script写到文件当中,在执行sed时-f 指定文件路径,如果是多个Script,换行写
 -r:支持扩展的正则表达式
 -i:直接将处理的结果写入文件
 -i.bak:在将处理的结果写入文件之前备份一份

地址定界:
 不给地址:对全文进行处理
 单地址:
 #: 指定的行
 /pattern/:被此处模式所能够匹配到的每一行
 地址范围:
 #,#
 #,+#
 /pat1/,/pat2/
 #,/pat1/
 ~:步进
  sed -n '1~2p'  只打印奇数行 (1~2 从第1行,一次加2行)
  sed -n '2~2p'  只打印偶数行

command:
 d:删除模式空间匹配的行,并立即启用下一轮循环
 p:打印当前模式空间内容,追加到默认输出之后
 a:在指定行后面追加文本,支持使用\n实现多行追加
 i:在行前面插入文本,支持使用\n实现多行追加
 c:替换行为单行或多行文本,支持使用\n实现多行追加
 w:保存模式匹配的行至指定文件
 r:读取指定文件的文本至模式空间中匹配到的行后
 =:为模式空间中的行打印行号
 !:模式空间中匹配行取反处理
 s///:查找替换,支持使用其它分隔符,如:s@@@,s###;
 加g表示行内全局替换;
 在替换时,可以加一下命令,实现大小写转换
 \l:把下个字符转换成小写。
 \L:把replacement字母转换成小写,直到\U\E出现。
 \u:把下个字符转换成大写。
 \U:把replacement字母转换成大写,直到\L\E出现。
 \E:停止以\L\U开始的大小写转换

实战

# options
[root@along ~]# cat demo
aaa
bbbb
AABBCCDD
[root@along ~]# sed "/aaa/p" demo  #匹配到的行会打印一遍,不匹配的行也会打印
aaa
aaa
bbbb
AABBCCDD
[root@along ~]# sed -n "/aaa/p" demo  #-n不显示没匹配的行
aaa
[root@along ~]# sed -e "s/a/A/" -e "s/b/B/" demo  #-e多点编辑
Aaa
Bbbb
AABBCCDD
[root@along ~]# cat sedscript.txt
s/A/a/g
[root@along ~]# sed -f sedscript.txt demo  #-f使用文件处理
aaa
bbbb
aaBBCCDD
[root@along ~]# sed -i.bak "s/a/A/g" demo  #-i直接对文件进行处理
[root@along ~]# cat demo
AAA
bbbb
AABBCCDD
[root@along ~]# cat demo.bak
aaa
bbbb
AABBCCDD

# 地址界定
[root@along ~]# cat demo
aaa
bbbb
AABBCCDD
[root@along ~]# sed -n "p" demo  #不指定行,打印全文
aaa
bbbb
AABBCCDD
[root@along ~]# sed "2s/b/B/g" demo  #替换第2行的b->B
aaa
BBBB
AABBCCDD
[root@along ~]# sed -n "/aaa/p" demo
aaa
[root@along ~]# sed -n "1,2p" demo  #打印1-2行
aaa
bbbb
[root@along ~]# sed -n "/aaa/,/DD/p" demo
aaa
bbbb
AABBCCDD
[root@along ~]# sed -n "2,/DD/p" demo
bbbb
AABBCCDD
[root@along ~]# sed "1~2s/[aA]/E/g" demo  #将奇数行的a或A替换为E
EEE
bbbb
EEBBCCDD

# command
[root@along ~]# cat demo
aaa
bbbb
AABBCCDD
[root@along ~]# sed "2d" demo  #删除第2行
aaa
AABBCCDD
[root@along ~]# sed -n "2p" demo  #打印第2行
bbbb
[root@along ~]# sed "2a123" demo  #在第2行后加123
aaa
bbbb
123
AABBCCDD
[root@along ~]# sed "1i123" demo  #在第1行前加123
123
aaa
bbbb
AABBCCDD
[root@along ~]# sed "3c123\n456" demo  #替换第3行内容
aaa
bbbb
123
456
[root@along ~]# sed -n "3w/root/demo3" demo  #保存第3行的内容到demo3文件中
[root@along ~]# cat demo3
AABBCCDD
[root@along ~]# sed "1r/root/demo3" demo  #读取demo3的内容到第1行后
aaa
AABBCCDD
bbbb
AABBCCDD
[root@along ~]# sed -n "=" demo  #=打印行号
1
2
3
[root@along ~]# sed -n '2!p' demo  #打印除了第2行的内容
aaa
AABBCCDD
[root@along ~]# sed 's@[a-z]@\u&@g' demo  #将全文的小写字母替换为大写字母
AAA
BBBB
AABBCCDD

高级编辑命令 (1)格式

 h:把模式空间中的内容覆盖至保持空间中
 H:把模式空间中的内容追加至保持空间中
 g:从保持空间取出数据覆盖至模式空间
 G:从保持空间取出内容追加至模式空间
 x:把模式空间中的内容与保持空间中的内容进行互换
 n:读取匹配到的行的下一行覆盖 至模式空间
 N:读取匹配到的行的下一行追加 至模式空间
 d:删除模式空间中的行
 D:删除 当前模式空间开端至\n 的内容(不再传 至标准输出),放弃之后的命令,但是对剩余模式空间重新执行sed

(2)一个案例+示意图演示 ① 案例:倒序输出文本内容

[root@along ~]# cat num.txt
One
Two
Three
[root@along ~]# sed '1!G;h;$!d' num.txt
Three
Two
One

② 示意图如下: 1.png ③ 总结模式空间与保持空间关系:

保持空间是模式空间一个临时存放数据的缓冲区,协助模式空间进行数据处理

(3)演示

seq 9 |sed -n 'n;p' # 显示偶数行
seq 9 |sed  '1!G;h;$!d' # 倒序显示
seq 9 |sed 'H;n;d' # 显示奇数行
seq 9 |sed 'N;D' # 显示最后一行
seq 9 |sed 'G' # 每行之间加空行
seq 9 |sed "g" # 把每行内容替换成空行
seq 9 |sed '/^$/d;G' # 确保每一行下面都有一个空行