文本三剑客之sed(行编辑器)

一、基本用法

1、sed的简单介绍
sed(Stream EDitor),行编辑器,一种流编辑器,它一次处理一行内容。
主要用来自动编辑一个或多个文件,简化对文件的反复操作,编写转换程序等。

执行过程:

1. 处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space)
2. sed 命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。
3. 然后读入下行,执行下一个循环。 如果没有使诸如‘D’的特殊命令,那会在两个循环之间清空模式空间,但不会清空保留空间。这样不断重复,直到文件末尾。
4. 文件内容并没有改变,除非你使用重定向存储输出。

用法:

sed [option]... 'script' inputfile...

1. option: 
-n		# 不输出模式空间内容到屏幕,即不自动打印
-e		# 多点编辑
-f /PATH/SCRIPT_FILE # 从指定文件中读取编辑脚本 
-r		# 支持使用扩展正则表达式 ''
-i.bak	# 备份文件并原处编辑

2. script:
'地址命令'
2、sed的基本用法

标准输入:

格式: sed [option] 'lineCMD' 文件名称
1. 含有标准输入处理,sed -n '2p'
	-n选项 和 p命令 一起使用表示只打印那些发生替换的行:
2. 示 例:
1[root@iZ2zegmcgqbevwf0lb4amuZ etc]# sed -n '2p'
aaaa
sss
sss

2[root@iZ2zegmcgqbevwf0lb4amuZ etc]# ifconfig eth0 |sed -n "2p"    # 打印出第二行至屏幕输出
        inet 172.30.208.101  netmask 255.255.240.0  broadcast 172.30.223.255
1)地址定界
1)没有地址,全文处理

2)单地址   
#: 指定的行,$:最后一行
/pattern/:被此处模式所能够匹配到的每一行

3)地址范围
#,#
#,+#
/pat1/,/pat2/
#,/pat1/

4)~:步进
1~2 奇数行
2~2 偶数行
2) 编辑命令
d		# 删除模式空间匹配的行,并立即启用下一轮循环
p		# 打印当前模式空间内容,追加到默认输出之后
a [\]text # 在指定行后面追加文本,支持使用\n实现多行追加 
i [\]text # 在行前面插入文本 
c [\]text # 替换行为单行或多行文本 
w /path/file 	# 保存模式匹配的行至指定文件 
r /path/file    # 读取指定文件的文本至模式空间中匹配到的行后 
=		# 为模式空间中的行打印行号 
!		# 模式空间中匹配行取反处理

s/// 	# 查找替换,支持使用其它分隔符,s@@@,s###

替换标记

g 		# 行内全局替换 
p 		# 显示替换成功的行
w /PATH/FILE # 将替换成功的行保存至文件中
3) 示例
p		# 打印当前模式空间内容,追加到默认输出之后
-n		# 只显示匹配处理的行,否则会输出所有,关闭默认的输出
1. sed '2p' /etc/passwd 		# 打印两遍(系统默认打印一遍)
2. sed -n '2p' /etc/passwd      # 只打印第二行
3. sed -n '1,4p' /etc/passwd 	# 只打印1到4行
4. sed -n '/root/p' /etc/passwd # 只打印包含root的行
5. sed -n '2,/root/p' /etc/passwd # 打印从2行开始到匹配root的行

=		# 为模式空间中的行打印行号 
-e		# 多点编辑
6. sed -n '/^$/=' file   # 显示空行行号 
7. sed -n –e '/^$/p' –e '/^$/=' file   # 显示空白行及对应的行号

a [\]text # 在指定行后面追加文本,支持使用\n实现多行追加 
i [\]text # 在行前面插入文本 
c [\]text # 替换行为单行或多行文本 
8. sed '/root/a\superman' /etc/passwd  # 行后 
9. sed '/root/i\superman' /etc/passwd  # 行前
10. sed '/root/c\superman' /etc/passwd # 代替行
 
d		# 删除模式空间匹配的行,并立即启用下一轮循环
11. sed '/^$/d' file     # 删除空白行
12. sed '1,10d' file 	 # 删除1到10行
13. nl /etc/passwd | sed '2,5d' # 删除2到5行
14. nl /etc/passwd | sed '2a tea'   # 第2行后插入一行,内容为tea

s/// 	# 查找替换
g 		# 行内全局替换
15. sed 's/test/mytest/g' example 
16. sed -n 's/root/&superman/p' /etc/passwd # 单词后添加rootsuperman
17. sed -n 's/root/superman&/p' /etc/passwd # 单词前添加supermanroot
18. sed -e 's/dog/cat/' -e 's/hi/lo/' pets  # 多次替换操作
19. sed -i.bak 's/dog/cat/g' pets			# 备份源文件pets.bak,并修改替换源文件

重点范例:

20. p命令:
sed 'p' /etc/passwd   --打印两遍,系统默认打印一遍
[root@iZ2zegmcgqbevwf0lb4amuZ etc]# sed -n '2p' passwd
bin:x:1:1:bin:/bin:/sbin/nologin

21. 两者等价:打印最后一行
[root@iZ2zegmcgqbevwf0lb4amuZ etc]# seq 10 | sed -n '$p'  
10
[root@iZ2zegmcgqbevwf0lb4amuZ etc]# seq 10 |tail -n1
10

22. 删除注释行和空行:
[root@iZ2zegmcgqbevwf0lb4amuZ etc]# sed '/^#/d;/^$/d' /etc/fstab

23. 分组:
+		# 代表匹配其前面的字符出现了至少1次
[]		# 表示指定范围内容的字符,括号里^表示非,括号外表示以什么开头
-r		# 支持使用扩展正则表达式 ''
[root@iZ2zegmcgqbevwf0lb4amuZ ~]# ifconfig eth0|sed -n '2p'|sed -r 's/(^[^0-9]+)([0-9.]+)( .*)/\2/'    # 取ip地址
172.30.xxx.xxx
[root@iZ2zegmcgqbevwf0lb4amuZ ~]# ifconfig eth0|sed -nr '2s/(^[^0-9]+)([0-9.]+)( .*)/\2/p'
172.30.xxx.xxx

注意:
& 等价于\1
sed中变量注意双引号,或者三单引号'''$num'''

[root@iZ2zegmcgqbevwf0lb4amuZ ~]# echo /etc/sysconfig/network-scripts/ |sed -r 's@(^/.*/)([^/]+)/?$@\2@'    # 取路径的最后一个目录名
network-scripts

待学习:
1.

在这里插入图片描述
2.
在这里插入图片描述

3、常用案例
1) 删除操作:d命令
1、删除空白行
	sed '/^$/d' file
2.删除文件的第2行:
	sed '2d' file
3.删除文件的第2行到末尾所有行:
  sed '2,$d' file
4.删除文件最后一行:
  sed '$d' file
5.删除文件中所有开头是test的行:
	sed '/^test/d' file
2) 已匹配字符串标记&

& 对应于之前所匹配到的单词

1.正则表达式 \w+ 匹配每一个单词,使用 [&] 替换它,& 对应于之前所匹配到的单词:
echo this is a test line | sed 's/\w\+/[&]/g'
[this] [is] [a] [test] [line]

2.所有以192.168.0.1开头的行都会被替换成它自已加localhost:
	sed 's/^192.168.0.1/&localhost/' file
	192.168.0.1localhost
3) 子串匹配标记\1
1.匹配给定样式的其中一部分:
	echo this is digit 7 in a number | sed 's/digit \([0-9]\)/\1/'
	this is 7 in a number
2. echo aaa BBB | sed 's/\([a-z]\+\) \([A-Z]\+\)/\2 \1/'
  BBB aaa
3. sed -n 's/\(love\)able/\1rs/p' file
4) 组合多个表达式
sed '表达式' | sed '表达式'
等价于:
sed '表达式; 表达式'
5) 变量引用
sed表达式可以使用单引号来引用,但是如果表达式内部包含变量字符串,就需要使用双引号
export test=WORLD
echo hello WORLD | sed "s/$test/szb"
HELLO szb
6) 选定行的范围:,(逗号)
1.所有在模板test和check所确定的范围内的行都被打印:
sed -n '/test/,/check/p' file

2.打印从第5行开始到第一个包含以test开始的行之间的所有行:
sed -n '5,/^test/p' file

3.对于模板test和west之间的行,每行的末尾后面追加用字符串aaa bbb替换:
sed '/test/,/west/s/$/aaa bbb/' file
7) 多点编辑:e命令
1.-e选项允许在同一行里执行多条命令:
	sed -e '1,5d' -e 's/test/check/' file
2.和 -e 等价的命令是 —expression:
	sed --expression='s/test/check/' --expression='/love/d' file
8) 基础命令–wrain

1. 从文件读入:r命令

file里的内容被读进来,显示在与test匹配的行后面
如果匹配多行,则file的内容将显示在所有匹配行的下面:
sed '/test/r file' filename

2. 写入文件:w命令

在example中所有包含test的行都被写入file里:
sed -n '/test/w file' example

3. 追加(行下):a\命令

1.将 this is a test line 追加到 以test 开头的行下一行:
	sed '/^test/\athis is a test line' file
2.在 test.conf 文件第2行之后插入 this is a test line:
	sed -i '2a\this is a test line' test.conf

4. 插入(行上):i\命令

1.将 this is a test line 追加到以test开头的行前面:
	sed '/^test/i\this is a test line' file
2.在test.conf文件第5行之前插入this is a test line:
	sed -i '5i\this is a test line' test.conf
9)nyq命令和hG命令
1.下一个:n命令
如果test被匹配,则移动到匹配行的下一行,替换这一行的aa,变为bb,并打印该行,然后继续:
	sed '/test/{ n; s/aa/bb/; }' file

2.变形:y命令
把1~10行内所有abcde转变为大写,注意,正则表达式元字符不能使用这个命令:
	sed '1,10y/abcde/ABCDE/' file

3.退出:q命令
打印完前10行后,退出sed
	sed '10q' file

4.保持和获取:h命令和G命令
任何包含test的行都被复制并追加到该文件的末尾
	sed -e '/test/h' -e '$G' file

5.保持和互换:h命令和x命令
互换模式空间和保持缓冲区的内容。也就是把包含test与check的行互换:
	sed -e '/test/h' -e '/check/x' file
10)打印奇数行或偶数行
1.方法1
	sed -n 'p;n' test.txt #奇数行
	sed -n 'n;p' test.txt #偶数行
2.方法2
	sed -n '1~2p' test.txt #奇数行
	sed -n '2~2p' test.txt #偶数行
11)打印匹配字符串的下一行
grep -A 1 aaa file
sed -n '/aaa/{n;p}' file
awk '/aaa/{getline; print}' file

在这里插入图片描述

4、高级编辑命令

命令符号

1. P:打印模式空间开端至\n内容,并追加到默认输出之前 
2. h: 把模式空间中的内容覆盖至保持空间中 
3. H:把模式空间中的内容追加至保持空间中 
4. g: 从保持空间取出数据覆盖至模式空间 
5. G:从保持空间取出内容追加至模式空间 
6. x: 把模式空间中的内容与保持空间中的内容进行互换
7. n: 读取匹配到的行的下一行覆盖至模式空间
8. N:读取匹配到的行的下一行追加至模式空间 
9. d: 删除模式空间中的行 
10. D:如果模式空间包含换行符,则删除直到第一个换行符的模式空间中的文本, 并不会读取新的输入行,而使用合成的模式空间重新启动循环。如果模式空间不包含换行符,则会像发出d命令那样启动正常的新循环

示例:

1. sed -n 'n;p' FILE 
2. . sed '1!G;h;$!d' FILE 
3. sed ‘N;D’FILE
4. sed '$!N;$!D' FILE 
5. sed '$!d' FILE 
6. sed ‘G’ FILE sed ‘g’ FILE
7. sed ‘/^$/d;G’ FILE 
8. sed 'n;d' FILE
9. sed -n '1!G;h;$p' FILE

重点示例

n: 读取匹配到的行的下一行覆盖至模式空间
1. 格式: sed -n 'n;p' FILE  -- 偶数打印
[root@iZ2zegmcgqbevwf0lb4amuZ ~]# seq 6 | sed -n 'n;p'
2
4
6

G:从保持空间取出内容追加至模式空间 
h: 把模式空间中的内容覆盖至保持空间中 
2. sed '1!G;h;$!d' FILE -- 取反
[root@iZ2zegmcgqbevwf0lb4amuZ ~]# seq 4 | sed '1!G;h;$!d'
4
3
2
1

N:读取匹配到的行的下一行追加至模式空间 
3. sed 'N;D' FILE   ---  打印最后一行
[root@iZ2zegmcgqbevwf0lb4amuZ ~]# seq 4 | sed 'N;D'
4

4. 其余示例:
sed '$!N;$!D' FILE
sed '$!d' FILE
sed 'G' FILE
sed 'g' FILE
sed '/^$/d;G' FILE
sed 'n;d' FILE 
sed -n '1!G;h;$p' FILE

5、练习
1. 删除centos7系统/etc/grub2.cfg文件中所有以空白开头的行行首的空白字符 
2. 删除/etc/fstab文件中所有以#开头,后面至少跟一个空白字符的行的行首的# 和空白字符
3. 在centos6系统/root/install.log每一行行首增加#号
4. 在/etc/fstab文件中不以#开头的行的行首增加#号
5. 处理/etc/fstab路径,使用sed命令取出其目录名和基名
6. 利用sed 取出ifconfig命令中本机的IPv4地址
7. 统计centos安装光盘中Package目录下的所有rpm文件的以.分隔倒数第二个 字段的重复次数
8. 统计/etc/init.d/functions文件中每个单词的出现次数,并排序(用grep和 sed两种方法分别实现)
9. 将文本文件的n和n+1行合并为一行,n为奇数行

二、参考文档

sed参考文档

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值