2018-03-08 文本处理工具sed

1、sed 工具简介

  • sed Stream EDitor, 行编辑器
  • 工具特性:sed是一种流编辑器,每次处理一行文本内容。
  • 工作过程:将当前行储存至内存空间中,称作“模式空间”(pattern space)。在模式空间中对行进行编辑,将处理结果输出至屏幕。一般情况下,清空模式空间内容,然后读入下一行执行下一个循环,如此循环直至文本文件行尾。
  • 功能:编辑一个或多个文件,简化对文件的反复操作,编写转换程序等

2、用法

sed[option]... 'script' inputfile...
常用选项:
-n:不输出模式空间内容到屏幕,即不自动打印
-e: 多点编辑
-f:/PATH/SCRIPT_FILE: 从指定文件中读取编辑脚本
-r: 支持使用扩展正则表达式
-i:文件原处编辑
-i.bak: 备份文件(后缀 .bak)并原处编辑
script:描述对文本的地址定界和编辑命令

3、地址定界

地址定界:
(1) 不给地址:对全文进行处理
(2) 单地址:
#: 指定第#行
/pattern/:被此处模式所能够匹配到的每一行
(3) 地址范围:
m,n:从第m行到第n行
m,+n:从第m行到第(m+n)行
/pat1/,/pat2/:从匹配pat1的行到匹配pat2的行
m,/pat1/:从第m行到匹配pat1的行
(4) ~:步进
1~2 奇数行:从1开始,每次步进2,即1,3,5,7···奇数列
2~2 偶数行:从2开始,每次步进2,即2,4,6,8···偶数列

4、编辑命令

d: 删除模式空间匹配的行,并立即启用下一轮循环
p:显示模式空间中的内容(仅打印符合条件的内容,本身是打印所有内容,一般是配合-n来配合使用以只显示符合条件的内容)
a \text:在指定行后面追加文本,支持使用\n实现多行追加
i \text:在行前面插入文本
c \text:替换行为单行或多行文本
w /path/somefile: 保存模式匹配的行至指定文件
r /path/somefile:读取指定文件的文本至模式空间中匹配到的行后
=: 为匹配的模式空间中的行打印行号
!:模式空间中匹配行取反处理

5、查找替换

s///:查找替换,支持使用其它分隔符,s@@@,s###
替换标记:
g: 行内全局替换
p: 显示替换成功的行
w /PATH/TO/SOMEFILE:将替换成功的行保存至文件中

6、sed执行流程图

7、举例

[root@centos6 app]#seq 11 |sed -n '1~2p'   ---打印奇数行
1
3
5
7
9
11
[root@centos6 app]#seq 11 |sed -n '2~2p'
2
4
6
8
10
[root@centos6 app]#seq 5|sed 'axy'
1
xy
2
xy
3
xy
4
xy
5
xy
[root@centos6 app]#seq 5|sed 'a\ xy'   ---\加不加都可以,但加上有的时候可以前面多个空格
1
 xy
2
 xy
3
 xy
4
 xy
5
 xy
[root@centos6 app]#seq 5|sed '2,4axyz'
1
2
xyz
3
xyz
4
xyz
5
[root@centos6 app]#seq 5|sed '2axyz\n====\n++++'  ---\n可以追加多行内容
1
2
xyz
====
++++
3
4
5
[root@centos6 ~]#sed '/^# Source/i alias yi="yum install"' .bashrc
# .bashrc

# User specific aliases and functions
alias grep='grep --color=auto'
alias egrep='egrep --color=auto'
alias rm='rm -i'
alias cp='cp -i'
alias mv='mv -i'
alias p='poweroff'
alias cdpack='cd /misc/cd/Packages/'
alias cdnet='cd /etc/sysconfig/network-scripts/'
alias yi="yum install"  ---在指定行的前面插入内容
# Source global definitions
if [ -f /etc/bashrc ]; then
    . /etc/bashrc
fi
[root@centos6 ~]#sed '/^SELINUX=enforcing/cSELINUX=permissive' /etc/selinux/config  ---替换

# This file controls the state of SELinux on the system.
# SELINUX= can take one of these three values:
#     enforcing - SELinux security policy is enforced.
#     permissive - SELinux prints warnings instead of enforcing.
#     disabled - No SELinux policy is loaded.
SELINUX=permissive
# SELINUXTYPE= can take one of these two values:
#     targeted - Targeted processes are protected,
#     mls - Multi Level Security protection.
SELINUXTYPE=targeted 
[root@centos6 ~]#seq 5|sed '2,4w /app/f1'  ---保存模式空间的内容到指定文件
1
2
3
4
5
[root@centos6 ~]#cd /app
[root@centos6 app]#ls
f1  mkdvdiso.sh
[root@centos6 app]#cat f1
2
3
4
[root@centos6 app]#seq 5|sed '3r /etc/issue'  ---读取文件中的内容到指定的行后
1
2
3
CentOS release 6.9 (Final)
Kernel \r on an \m
\l
\n
\t
4
5
[root@centos6 app]#sed -e '/^#/d' -e '/^$/d' /etc/fstab  ---多点编辑,表示以#开头的行和空行删除
UUID=07e3094b-c50d-4568-aee5-b2f76d91c962 /                       ext4    defaults        1 1
UUID=4a2031c3-8595-489e-bc6d-1e2c31860c7b /app                    ext4    defaults        1 2
UUID=a056e3b8-7cc2-4aea-9308-9b0744741394 /boot                   ext4    defaults        1 2
UUID=953b7594-f906-4d3e-8a3a-a6bb79b1c900 swap                    swap    defaults        0 0
UUID=d027885d-e32b-42e7-94aa-329130282748 /home                   ext4    usrquota,grpquota        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
[root@centos6 app]#vim sed.txt
  1 /^s/d
[root@centos6 app]#cat f2
bbbdddd
sdfgggg
1234445
[root@centos6 app]#sed -f sed.txt f2  ---调用文件中的脚本
bbbdddd
1234445
[root@centos6 app]#sed -n 's/ext4/xfs/p' /etc/fstab   --- p表示只打印匹配成功的行
UUID=07e3094b-c50d-4568-aee5-b2f76d91c962 /                       xfs    defaults        1 1
UUID=4a2031c3-8595-489e-bc6d-1e2c31860c7b /app                    xfs    defaults        1 2
UUID=a056e3b8-7cc2-4aea-9308-9b0744741394 /boot                   xfs    defaults        1 2
UUID=d027885d-e32b-42e7-94aa-329130282748 /home                   xfs    usrquota,grpquota        0 0
[root@centos6 app]#sed -nr 's/(bash)$/\1er/pg' p1---分组和后向引用
root:x:0:0:root:/root:/bin/basher
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/basher
zhang:x:500:500::/home/zhang:/bin/basher
tom:x:504:505::/home/tom:/bin/basher
libai:x:510:510::/home/libai:/bin/basher
dufu:x:512:512::/home/dufu:/bin/basher
zhaoritian:x:514:514::/home/zhaoritian:/bin/basher
gentoo:x:515:501:Gentoo Distribution:/home/gentoo:/bin/basher
natasha:x:516:516::/home/natasha:/bin/basher
harry:x:517:504::/home/harry:/bin/basher
alice:x:518:518::/home/alice:/bin/basher
bash:x:519:520::/home/bash:/bin/basher
testbash:x:520:521::/home/testbash:/bin/basher
sh:x:521:522::/home/sh:/bin/basher
[root@centos6 app]#sed -nr 's/bash$/&er/pg' p1 ---可以用&代替前面匹配的内容
root:x:0:0:root:/root:/bin/basher
mysql:x:27:27:MySQL Server:/var/lib/mysql:/bin/basher
zhang:x:500:500::/home/zhang:/bin/basher
tom:x:504:505::/home/tom:/bin/basher
libai:x:510:510::/home/libai:/bin/basher
dufu:x:512:512::/home/dufu:/bin/basher
zhaoritian:x:514:514::/home/zhaoritian:/bin/basher
gentoo:x:515:501:Gentoo Distribution:/home/gentoo:/bin/basher
natasha:x:516:516::/home/natasha:/bin/basher
harry:x:517:504::/home/harry:/bin/basher
alice:x:518:518::/home/alice:/bin/basher
bash:x:519:520::/home/bash:/bin/basher
testbash:x:520:521::/home/testbash:/bin/basher
sh:x:521:522::/home/sh:/bin/basher
[root@centos6 app]#ifconfig eth2|sed -n -e '2s/^.*addr://' -e '2s/ .*$//p'  ---取出IP地址
192.168.25.179
[root@centos6 app]#ifconfig eth2|sed '2!d;s/^.*addr://;s/ .*$//'   ---分号表示可以执行多次操作;2!d表示第2行不执行d命令(除了第2行都执行d命令)
192.168.25.179

8、sed 工具高级用法

  • 保持空间(hold space):一段内存空间,可以从模式空间读数据也可向模式空间写数据,为sed工具提供了更加灵活的使用方法。
  • sed有模式空间和保持空间,sed的所有编辑操作都在模式空间中进行编辑,编辑完如果还没有编辑结束,等下还要做编辑,可以先挪到保持空间,然后模式空间做其它处理,处理完后再把保持空间中的行再挪回来,再进行处理。保持空间是个半成品仓库
  • sed的高级编辑命令

P:打印模式空间开端至\n内容,并追加到默认输出之前
h:把模式空间中的内容覆盖至保持空间中
H:把模式空间中的内容追加至保持空间中
g:从保持空间取出数据覆盖至模式空间
G:从保持空间取出内容追加至模式空间
x:把模式空间中的内容与保持空间中的内容进行互换
n: 读取匹配到的行的下一行覆盖至模式空间
N:读取匹配到的行的下一行追加至模式空间
d:删除模式空间中的行
D:删除多行模式空间中的第一行

9、图解sed ‘1!G;h;$!d’ file

1!G 第一行不执行G命令,从第二行开始执行
$!d 最后一行不删除(其它行删除)

[root@localhost test]# cat file
1 1 1
2 2 2
3 3 3
[root@localhost test]# sed '1!G;h;$!d' file
3 3 3
2 2 2
1 1 1

图中P代表Pattern Space,H代表Hold Space。绿色代表pattern space中的数据,蓝色代表hold space中的数据。


image.png

10、举例

[root@localhost ~]#seq 11 | sed -n 'n;p'    ---打印偶数行
2
4
6
8
10
[root@localhost ~]#seq 11 | sed '1!G;h;$!d'    ---倒序输出行
11
10
9
8
7
6
5
4
3
2
1
[root@localhost ~]#seq 11 | sed 'N;D'    ---打印最后一行
11
[root@localhost ~]#seq 11 | sed '$!N;$!D'    --打印最后两行
10
11
[root@localhost ~]#seq 11 | sed '$!d'    ---打印最后一行
11
[root@localhost ~]#seq 11 | sed 'G'    ---每一行后添加一行空行
1

2

3

4

5

6

7

8

9

10

11

[root@localhost ~]#seq 11 | sed 'g'    ---将每一行都清空为空行











sed '/^$/d;G' num    ---所有空行删除,所有非空行之间添加一行空行

[root@localhost ~]#seq 11 | sed 'n;d'    ---打印奇数行
1
3
5
7
9
11
[root@localhost ~]#seq 11 | sed -n '1!G;h;$p'    ---倒序输出行
11
10
9
8
7
6
5
4
3
2
1
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 212,383评论 6 493
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 90,522评论 3 385
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 157,852评论 0 348
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 56,621评论 1 284
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 65,741评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 49,929评论 1 290
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,076评论 3 410
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 37,803评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,265评论 1 303
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,582评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,716评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,395评论 4 333
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,039评论 3 316
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,798评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,027评论 1 266
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,488评论 2 361
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,612评论 2 350

推荐阅读更多精彩内容