一、基本用法
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为奇数行