sed高级命令

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 ~]# 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

枯木逢秋࿐

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值