sed命令

简介

sed 是一种在线编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有 改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。

选项与参数:

  • -n :使用安静(silent)模式。在一般 sed 的用法中,所有来自 STDIN 的数据一般都会被列出到终端上。但如果加上 -n 参数后,则只有经过sed 特殊处理的那一行(或者动作)才会被列出来。
  • -e :直接在命令列模式上进行 sed 的动作编辑;
  • -f :直接将 sed 的动作写在一个文件内, -f filename 则可以运行 filename 内的 sed 动作;
  • -r :sed 的动作支持的是延伸型正规表示法的语法。(默认是基础正规表示法语法)
  • -i :直接修改读取的文件内容,而不是输出到终端。

N 多行操作命令

N命令简单来说就是追加下一行到模式空间,同时将两行看做一行,但是两行之间依然含有\n换行符,然后执行后续命令,然后再读取新行,对新读取的内容重头执行sed。此时,新读取的行会覆盖之前的行(之前的两行已经合并为一行)。如果命令未执行成功(并非跳过:前端条件不匹配),则放弃之后任何命令,并对新读取的内容,重头执行sed。

[root@localhost ~]# cat mkf.txt 
mkf 1.
mkf 2.
mkf 3.
mkf 4.

[root@localhost ~]# sed '/first/{N;s/\n/ /}' mkf.txt 
mkf 1.
mkf 2.mkf 3.
mkf 4.

D 多行删除命令

D命令是删除当前模式空间开端至\n的内容(不在传至标准输出),放弃之后的命令,但是对剩余模式空间重新执行sed。

[root@localhost ~]# cat 1.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}' 1.txt 
On Tuesday, the Linux System
Administrator's group meeting will be held.
All System Administrators should attend.

Thank you for your attendance.

P 多行打印命令

同 d 和 D 之间的区别一样,P(大写)命令和单行打印命令 p(小写)不同,对于具有多行数据的缓冲区来说,它只会打印缓冲区中的第一行,也就是首个换行符之前的所有内容。

[root@localhost ~]# cat test
2
3
22
33
222
333
// 使用P命令:
[root@localhost ~]# sed '/.*/N;P' test
2
2
3
22
22
33
222
222
333
// 使用p命令:
[root@localhost ~]# sed '/.*/N;p' test
2
3
2
3
22
33
22
33
222
333
222
333
使用的是 p (小写)单行打印命令,它会将缓冲区中的所有内容全部打印出来(n 会自动输出为换行),因此,出现了看到的结果。

大写转换

转换命令可以进行小写字母到大写字母的转换,但它将转换应用于整个行。使用保持空间可以实现以上任务,因为可以用保持空间来存储输入行的备份而将语句名独立出来,并在模式空间进行转换。

将小写的w转换成大写的W:
第一步读取一行执行h,放入保持空间.
第二步把所有小写字母换成大写
第三步通过替换命令把字母和数字位置调换

[root@localhost ~]# cat hello 
mmm
kf
mkf
[root@localhost ~]# cat mkf
/m/{
y/m/M/
h
}
[root@localhost ~]# sed -f mkf hello 
MMM
kf
Mkf

sed保持空间

保持空间用于保存模式空间的内容,模式空间的内容可以复制到保持空间,同样地保持空间的内容可以复制回模式空间。sed提供了几组命令用来完成复制的工作,其它命令无法匹配也不能修改模式空间的内容。 操作保持空间的命令如下所示:

命令功能
h将模式空间中的内容复制到保持空间
H将模式空间中的内容附加到保持空间
g将保持空间中的内容复制到模式空间
G将保持空间中的内容附加到模式空间
x交换模式空间和保持空间中的内容

通常,在使用 h 或 H 命令将字符串移动到保持空间后,最终还要用 g、G 或 x 命令将保存的字符串移回模式空间。保持空间最直接的作用是,一旦我们将模式空间中所有的文件复制到保持空间中,就可以清空模式空间来加载其他要处理的文本内容。

[root@localhost ~]# cat mkf.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 -n '/first/ {h ; p ; n ; p ; g ; p }' mkf.txt 
This is the first data line.
This is the second data line.
This is the first data line.

这个例子的运行过程是这样的:

sed脚本命令用正则表达式过滤出含有单词first的行;
当含有单词 first 的行出现时,h 命令将该行放到保持空间;
p 命令打印模式空间也就是第一个数据行的内容;
n 命令提取数据流中的下一行(This is the second data line),并将它放到模式空间;
p 命令打印模式空间的内容,现在是第二个数据行;
g 命令将保持空间的内容(This is the first data line)放回模式空间,替换当前文本;
p 命令打印模式空间的当前内容,现在变回第一个数据行了。

基本使用

[root@localhost ~]# cat test
2
3
22
33
222
333
// 使用h命令:
[root@localhost ~]# sed 'h' test
2
3
22
33
222
333
// 使用G命令
[root@localhost ~]# sed 'G' test
2

3

22

33

222

333
前者返回的结果正常,因为复制到保持空间的内容并没有取回;后者每一行的后面都多了一个空行,原因是每行都会从保持空间取回一行,追加(大写的G)到模式空间的内容之后,以\n分隔。 2. 使用x命令交换空间

// 使用x命令
[root@localhost ~]# sed 'x' test

2
3
22
33
222

命令执行后,发现前面多了一个空行并且最后一行不见了。我在前面一直强调sed命令用好,要有用大脑回顾命令执行过程的能力: * 当读入第一行的时候,模式空间中的内容是第一行的内容,而保持空间是空的,这个时候交换两个空间,导致模式空间为空,保持空间为第一行的内容,因此输出为空行; * 当读入下一行之后,模式空间为第2行的内容,保持空间为第一行的内容,交换后输出第1行的内容; * 依次读入每一行,输出上一行的内容; * 直到最后一行被读入到模式空间,交换后输出倒数第二行的内容,而最后一行的内容并没有输出,此时命令执行结束。

// 这里的目的是颠倒以w开始的行和以j开始的行的顺序。下面展示了如何使用保持空间:我们将第-一行复制到保持空间(它一直在那),这时清除模式空间。
[root@localhost ~]# cat hello 
mmm
kf
mkf
[root@localhost ~]# cat mkf
/m/{
h
d
}
/k/{
G
}
[root@localhost ~]# sed -f mkf hello 
kf
mmm

// 文件每一行之后插入空行,保持空间是空,所以G追加到模式空间也就是空行了.
[root@localhost ~]# cat hello 
mmm
kf
mkf
[root@localhost ~]# sed 'G' hello 
mmm

kf

mkf

sed改变指定流程

b 分支命令
通常,sed 程序的执行过程会从第一个脚本命令开始,一直执行到最后一个脚本命令(D 命令是个例外,它会强制 sed 返回到脚本的顶部,而不读取新的行)。sed 提供了 b 分支命令来改变命令脚本的执行流程,其结果与结构化编程类似。

命令格式:[address]b [label]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值