sed高级命令
简介
sed是一种流编辑器,它是文本处理中非常中的工具,能够完美的配合正则表达式使用,功能不同凡响。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。
sed是Linux下一款功能强大的非交互流式文本编辑器,可以对文本文件进行增、删、改、查等操作,支持按行、按字段、按正则匹配文本内容,灵活方便,特别适合于大文件的编辑。本文主要介绍sed的一些基本用法,并通过shell脚本演示sed的使用实例。
sed的使用方法,调用sed 命令的语法有两种:
一.在命令行指定sed指令对文本进行处理:sed +选项 ‘指令’ 文件
二.先将sed指令保存到文件中,将该文件作为参数进行调用:sed +选项 -f 包含sed指令的文件 文件
sed的常用选项:
-r:使用扩展正则表达式
-e:它告诉sed将下一个参数解释为一个sed指令,只有当命令行上给出多个sed指令时才需要使用-e选项
-f:后跟保存了sed指令的文件
-i:直接对内容进行修改,不加-i时默认只是预览,不会对文件做实际修改
-n:取消默认输出,sed默认会输出所有文本内容,使用-n参数后只显示处理过的行
sed中的编辑命令:
a:追加 向匹配行后面插入内容
c:更改 更改匹配行的内容
i:插入 向匹配行前插入内容
d:删除 删除匹配的内容
s:替换 替换掉匹配的内容
p:打印 打印出匹配的内容,通常与-n选项和用
=:用来打印被匹配的行的行号
n:读取下一行,遇到n时会自动跳入下一行
sed执行过程
sed高级命令
命令 | 功能 |
---|---|
Next (N) | 将数据流中的下一行加进来创建一个多行组来处理 |
Delete(D) | 删除多行组中的一行 |
Hold (h或H) | 将模式空间的内容复制或追加到保持空间 |
Get (g或G) | 将保持空间的内容复制或追加到模式空间 |
Exchange (x) | 交换保持空间和模式空间的内容 |
Branch (b) | 使被终止的后台程序立刻回到执行状态 |
N 多行操作命令
N 命令会将下一行文本内容添加到缓冲区已有数据之后(之间用换行符分隔),从而使前后两个文本行同时位于缓冲区中,sed 命令会将这两行数据当成一行来处理。
#sed 命令查找含有单词 first 的那行文本。找到该行后,它会用 N 命令将下一行合并到那行,然后用替换命令 s 将换行符替换成空格。结果是,文本文件中的两行在 sed 的输出中成了一行
[root@localhost ~]# cat liu.txt
This is the header line.
This is the first data line.
This is the second data line.
This is the last line.
[root@localhost ~]# sed '/first/{N;s/\n/ /}' liu.txt
This is the header line.
This is the first data line. This is the second data line.
This is the last line.
##读取第一行qqq,放入模式空间,执行N,模式空间为qqq\nww,执行s替换\n为空格,结果为qqq ww,默认输出qqq ww,读取第三行qqqq,放入模式空间,执行N,模式空间为qqqq\nwww,执行s替换\n为空格,结果为qqqq www,默认输出qqqq www.....
##读取第九行9,执行N失败,不执行后续命令,默认输出9,每两行为一组倒序排列
[root@localhost ~]# cat liu
qqq
ww
qqqq
www
rr
qqqqq
[root@localhost ~]# sed 'N;s@\n@ @g' liu
qqq ww
qqqq www
rr qqqqq
D 多行删除命令
sed 不仅提供了单行删除命令(d),也提供了多行删除命令 D,其作用是只删除缓冲区中的第一行,也就是说,D 命令将缓冲区中第一个换行符(包括换行符)之前的内容删除掉。如果模式空间包含换行符,则删除直到第一个换行符的模式空间中的文本, 并不会读取新的输入行,而使用合成的模式空间重新启动循环。如果模式空间不包含换行符,则会像发出d命令那样启动正常的新循环。
# sed会查找空白行,然后用 N 命令来将下一文本行添加到缓冲区。此时如果缓冲区的内容中含有单词 header,则 D 命令会删除缓冲区中的第一行。
[root@localhost ~]# cat lq.txt
On Tuesday, the Linux System
Administrator's group meeting will be held.
All System Administrators should attend.
Thank you for your attendance.
[root@localhost ~]# sed '/^$/{N ; /System/D}' lq.txt
On Tuesday, the Linux System
Administrator's group meeting will be held.
All System Administrators should attend.
Thank you for your attendance.
## 当遇到两个空行时,D 命令只删除两个空行中的第一个。下一次读取该脚本时,这个空行会被另一行读入模式空间。如果那行不为空,那么两行都输出,因此确保了输出一个空行。说白点就是,当模式空间中有两个空行时,只有第一个空行被删除,当一个空行后面跟有文本时,不对模式空间里的内容处理。
[root@localhost ~]# cat lq.txt
On Tuesday, the Linux System
Administrator's group meeting will be held.
All System Administrators should attend.
Thank you for your attendance.
[root@localhost ~]# sed '/^$/{N;/^\n$/D}' lq.txt
On Tuesday, the Linux System
Administrator's group meeting will be held.
All System Administrators should attend.
Thank you for your attendance.
大写转换
转换命令可以进行小写字母到大写字母的转换,但它将转换应用于整个行。使用保持空间可以实现以上任务,因为可以用保持空间来存储输入行的备份而将语句名独立出来,并在模式空间进行转换。
##将小写的w转换成大写的W
##第一步读取一行执行h,放入保持空间.
##第二步把所有小写字母换成大写
##第三步通过替换命令把字母和数字位置调换
[root@localhost ~]# cat liu
qqq
ww
qqqq
www
rr
qqqqq
[root@localhost ~]# cat qiang
/w/{
y/w/W/
h
}
[root@localhost ~]# sed -f qiang liu
qqq
WW
qqqq
WWW
rr
qqqqq
H/G/h/g命令:
大写的H/G都为追加操作
H为模式空间追加到保持空间
G为保持空间追加到模式空间
小写的h/g都是覆盖操作
h为模式空间覆盖保持空间
g为保持空间覆盖模式空间
命令中的每一条都可以利用一个地址来指定一行或行范围.空穴(h,H)命令将数据移至保持空间、而得到(G.G)命令将保持空间的数据移回到模式空间。同一命令的小写字母和大写字母之间的差别是,小字字母命令改写目的缓存区的内容,而大写字母命令追加缓存区的现有内容.
Hole命令在保持空间的内容之后放置一个换行符,且后面跟随模式空间的内容(即使保持空间是空的,换行符也被追加到保持空间中)。Get命令模式空间的内容之后放置一个换行符,且后面跟随保持空间的内容
Hole命令在保持空间的内容之后放置一个换行符,且后面跟随模式空间的内容(即使保持空间是空的,换行符也被追加到保持空间中)。Get命令模式空间的内容之后放置一个换行符,且后面跟随保持空间的内容。
我们使用较通俗的示例来解释在保持空间放入行,并在稍后检索它们的情况。我们将编写一个脚本来反转部分行。我们将使用一个数字列表作为样本文件:
##这里的目的是颠倒以q开始的行和以w开始的行的顺序。下面展示了如何使用保持空间:我们将第-一行复制到保持空间(它一直在那),这时清除模式空间。然后sed将第二行读入模式空间,并且将保持空间的行追加到模式空间的结尾。
[root@localhost ~]# cat liu
qqq
ww
qqqq
www
rr
qqqqq
[root@localhost ~]# cat qiang
/q/{
h
d
}
/w/{
G
}
[root@localhost ~]# sed -f qiang liu
ww
qqq
www
qqqq
rr
##文件每一行之后插入空行,保持空间是空,所以G追加到模式空间也就是空行了.
[root@localhost ~]# cat liu
qqq
ww
qqqq
www
rr
qqqqq
[root@localhost ~]# sed 'G' liu
qqq
ww
qqqq
www
rr
qqqqq
b 分支命令
通常,sed 程序的执行过程会从第一个脚本命令开始,一直执行到最后一个脚本命令(D 命令是个例外,它会强制 sed 返回到脚本的顶部,而不读取新的行)。sed 提供了 b 分支命令来改变命令脚本的执行流程,其结果与结构化编程类似。
命令格式:[address]b [label]
##使用b分支命令可以使数据流中的第1行和第2行并没有执行那两个替换命令。
[root@localhost ~]# cat liu
qqq
ww
qqq
www
rr
qqq
[root@localhost ~]# sed '{1,2b ; s/qqq/ttt/ ; s/ww/uiui!/}' liu
qqq
ww
ttt
uiui!w
rr
ttt
##b分支语句实现循环删除?,当缓冲区的内容出现?时,命令会一直执行循环,每执行一次就会删除一次?,直到内容中没有出现?时,就会终止循环。
[root@localhost ~]# cat tyty
yes? no? yes? no?
[root@localhost ~]# sed -n '{
:rm
s/?//p
/?/b rm
}' tyty
yes no? yes? no?
yes no yes? no?
yes no yes no?
yes no yes no
[root@localhost ~]#