文本处理三剑客之sed(流编辑器)
- 行编辑器
把当前处理的行存储在临时缓冲区,称为模式空间,然后把模式空间的内容送往屏幕,一行一行的处理,主要用来编辑一个或者多个文件。
- 用法
- sed [option]... ‘script‘ inputfile...
###### - 常用选项
- -n:不输出模式空间内容到屏幕,即不自动打印 默认会打印模式空间的内容
加-n 可以只显示需要打印的行
[root@localhost home]# sed -n ‘2,3p‘ /etc/passwd
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
- -e:多点编辑
[[email protected] home]# sed -n -e ‘/^$/=‘ -e ‘/^U/=‘ /etc/fstab
1
9
10
11
12
13
14
15
显示/etc/fstab中的空行和U开头的行的行号
- -r: 支持使用扩展正则表达式
[[email protected] home]# echo /etc/sysconfig/network-scripts/ | sed -r ‘[email protected](^/.*/)([^/]+/?)@\[email protected]‘
network-scripts/
取地址的基名,用正则表达式, 字符替换的方式,分两组用“()”, 第二组“^/”代表不止一个字符 “/?”代表前面的“/”可有可无,\2取第二组
- -i .bak: 备份文件并原处编辑
[root@111 home]# echo ‘1111111‘ >f1
[root@111 home]# echo ‘2222222‘ >>f1
[root@111 home]# echo ‘3333333‘ >>f1
[root@111 home]# cat f1
1111111
2222222
3333333
[root@111 home]# sed -i.bak "2d" f1
[root@111 home]# cat f1
1111111
3333333
[root@111 home]# cat f1.bak
1111111
2222222
3333333
- 加.bak是备份文件的,如果不加.bak很危险,以免失误先保存。
- -f :/ PATH/SCRIPT_FILE : 从指定文件中读取编辑脚本
sed -f /PATH/SCRIPT_FILE
执行脚本 给sed更多功能
- 地址定界
- script: ‘ 地址命令‘
- 不给地址:对全文进行处理 默认情况下显示全文
- 单地址: #: 指定的行 “#”代表任意一行行数
- /pattern/ :被此处模式所能够匹配到的每一行
‘/^$/‘ 匹配空行
- #,# 第几行到第几行
/pat1/,/pat2/
匹配到的第一个字符的第一行
到匹配到的第二个字符的最后一行
- #,/pat1/
- sed –n ‘1,4p’ /etc/passwd
- 显示1到4行的内容
- ~ :步进
- 1~2 只显示文件内的奇数行
- 说明(1)~( 1,2)下一位数就是(3)
举例:seq 10 | sed -n ‘1~2p’
- 2~2 同理显示文件内的偶数行,
- 当然奇数行偶数行显示不止这一种方式以下奇数行举例
- seq 10|sed -n ‘1~2p‘
- seq 10|sed ‘2~2d‘
- seq 10|sed -n ‘2~2!p‘
- seq 10|sed ‘n;d‘
- 编辑命令
选项 | 介绍 |
---|---|
d | 删除模式空间匹配的行 |
p | 显示模式空间中的内容 |
a []text | 在指定行 后面 追加文本支持使用\n实现多行追加 |
i []text | 在行前面插入文本 |
c []text | 替换行为单行或多行文本 |
w /path/somefile | 保存模式匹配的行至指定文件 |
r /path/somefile | 读取指定文件的文本至 模式空间中匹配的行后 |
= | 为模式空间中的行打印行号 |
! | 模式空间中匹配行取反处理 |
s/// | 查找替换, 支持使用其它分隔符,[email protected]@@ ,s### |
g | 整行替换 如果不加g 只替换每行第一个匹配到的字符 |
w /PATH/TO/SOMEFILE | 将替换成功的 行 保存至文件中 |
很危险的命令 替换之前先保存
给3~6行打印行号
[root@111 home]# cat /etc/passwd | sed ‘3,6=‘
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
3
daemon:x:2:2:daemon:/sbin:/sbin/nologin
4
adm:x:3:4:adm:/var/adm:/sbin/nologin
5
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
6
sync:x:5:0:sync:/sbin:/bin/sync
把root替换成ROOT并保存到 p1文件中
[root@111 home]# sed -n ‘s/root/ROOT/w p1‘ /etc/passwd
[root@111 home]# cat p1
ROOT:x:0:0:root:/root:/bin/bash
operator:x:11:0:operator:/ROOT:/sbin/nologin
给/etc/passwd文件中的第3~6行后面加上/etc/issue文件中的内容
[root@111 home]# cat /etc/passwd | sed ‘3,6r /etc/issue‘
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
CentOS release 6.8 (Final)
Kernel \r on an \m
adm:x:3:4:adm:/var/adm:/sbin/nologin
CentOS release 6.8 (Final)
Kernel \r on an \m
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
CentOS release 6.8 (Final)
Kernel \r on an \m
sync:x:5:0:sync:/sbin:/bin/sync
CentOS release 6.8 (Final)
Kernel \r on an \m
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
这个例子不太明显 就是passwd中的第3~6行不显示
[root@111 home]# sed ‘3,6!p‘ /etc/passwd
root:x:0:0:root:/root:/bin/bash
root:x:0:0:root:/root:/bin/bash
daemon:x:2:2:daemon:/sbin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
注释全文
[root@111 home]# sed -r ‘s/^[^#]/#&/‘ /etc/fstab
#
# /etc/fstab
# Created by anaconda on Thu Mar 30 04:43:20 2017
#
# Accessible filesystems, by reference, are maintained under ‘/dev/disk‘
# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info
#
#UUID=5bcb6b51-15c5-4820-bab4-d365adf45e81 / ext4 defaults 1 1
#UUID=910d7084-86b0-4de8-b3c2-c691e309f35f /apps ext4 defaults 1 2
#UUID=391dcc7d-a5f2-4495-bc11-d8577c48a29f /boot ext4 defaults 1 2
#UUID=d1c98cc5-2350-462b-a42d-5a23cad37ed9 /home ext4 defaults 1 2
#UUID=41ab819e-889c-4714-9fd6-1c5379f51451 /tmp ext4 defaults 1 2
#UUID=ee36b6c3-6e6f-4f48-bc3c-75311760e9ee swap swap defaults 0 0
#tmpfs /dev/shm tmpfs defaults 0 0
#devpts /dev/pts devpts gid=5,mode=620 0 0
#sysfs /sys sysfs defaults 0 0
#proc /proc proc defaults 0 0
高级编程命令
- 烧脑模式 前方高能 请警惕
- sed除了“模式空间”(pattern space),还有一个“hold space”内存空间,称之为保持空间
sed工作机制是每次读取一行文本至“模式空间”中,在模式空间中完成处理,将处理结果输出至标准标准输出设备;在模式空间中处理一行内容后会继续处理下一行,那么对于处理过的行可能还会有其他的处理,因此可以先把处理过的行“传送”至保持空间,然后在后续的处理中再次"传送"回模式空间中,这就类似加工车间及仓库的概念,好比模式空间是交工车间,保持空间是仓库,不过这里的仓库存放的是半成品。
选项 | 介绍 |
---|---|
d | 删除模式空间中的行 |
D | 删除 当前模式空间开端至\n 的内容( 不再传 至标准输出),放弃之后的命令,但是对剩余模式空间重新执行sed |
g | 从保持空间取出数据覆盖至模式空间 |
G | 从保持空间取出内容追加至模式空间 |
x | 把模式空间中的内容与保持空间中的内容进行互换 |
n | 读取匹配到的行的下一行 覆盖 至模式空间 |
N | 读取匹配到的行的下一行 追加 至模式空间 |
h | 把模式空间中的内容覆盖至保持空间中 |
H | 把模式空间中的内容追加至保持空间中 |
这里举例:sed ‘1!G;h;$!d‘ FILE1
这里用FILE1文件举例 比如文件内容总共三行
1!G:如果不是第一行从保持空间取出内容追加至模式空间
$!d:不是最后一行删除模式空间中的行
1、把FILE1文件第一行“111111”输出到模式空间
2、把模式空间“111111”内容存至保持空间
1、把FILE1文件第二行输出到模式空间
2、把保持空间的“111111”追加至模式空间
3、把模式空间的“222222”“111111”覆盖至保持空间
1、把FILE1文件第三行输出至模式空间
2、把保持空间内容“222222”“111111”追加至模式空间
3、默认打印模式空间的内容至屏幕
时间: 2024-10-23 20:43:42