Linux sed命令

Linux sed命令

sed命令

命令格式

sed的命令格式: sed [options] 'command' file;
sed的脚本格式: sed [options] -f scriptfile file;

sed选项

-e: 在命令行模式上进行sed动作编辑,为默认选项;当给出多个指令时需要用-e选项,告诉sed将下一个参数解释为指令
-f:sed的动作写在文件中,用-f filename 执行文件内动作
-i: 直接修改文件内容
-n: 只打印模式匹配的行
-r: 支持扩展表达式

指定简单的指令

// 单引号可以换! , #等。 根据实际情况使用
sed [-e] 'instruction' filename 

三种方式指定多重命令

1.用分号分隔指令

sed 's/tom/TOM/;s/jerry/JERRY/' test

2.在每个指令前放置-e

sed -e 's/tom/TOM/' -e 's/jerry/JERRY/' test

3.使用Bourne shell的分行指令功能

[root@localhost ~]# sed '
> s/tom/TOM/
> s/jerry/JERRY/
> ' test

模式空间和保持空间的概念

sed 有两个内置的存储空间:

名称概念
模式空间(pattern space)模式空间用于 sed 执行的正常流程中。该空间 sed 内置的一个缓冲区,用来存放、修改从输入文件读取的内容。
保持空间 (hold space)保持空间是另外一个缓冲区,用来存放临时数据。Sed 可以在保持空间和模式空间交换数据,但是不能在保持空间上执行普通的 sed 命令。

常用命令选项

与模式空间和暂存空间(hold space)相关的命令:

n 输出模式空间行,读取下一行替换当前模式空间的行,执行下一条处理命令而非第一条命令。
N 读入下一行,追加到模式空间行后面,此时模式空间有两行。
h 把模式空间里的行拷贝到暂存空间。
H 把模式空间里的行追加到暂存空间。
g 用暂存空间的内容替换模式空间的行。
G 把暂存空间的内容追加到模式空间的行后。
x 将暂存空间的内容于模式空间里的当前行互换。
! 对所选行以外的所有行应用命令。
注意:暂存空间里默认存储一个空行。

sed命令

s 替换指定字符

[root@localhost ~]# cat test 
one two three
test redhat nata
tom jerry zhangsan

123 310 ABC
[root@localhost ~]# sed 's/zhangsan/lisi/' test
one two three
test redhat nata
tom jerry lisi

111 222 333

a 在当前行下插入文本

#在文件test行下插入文本
[root@node3 ~]# sed '/test/a\first' test
one two three
test redhat nata
tom jerry lisi

111 222 ABC

# 在文件第二行下插入文本
[root@node3 ~]# sed '2a\first' test
one two three
test redhat nata
first
tom jerry lisi

111 222 ABC

N多行命令

多行Next (N)命令通过读取新的输入行,并将它添加到模式空间的现有内容之后来创建多行模式空间。模式空间最初的内容和新的输入行之间用换行符分隔。在模式空间中嵌入的换行符可以利用转义序列“\n”来匹配。在多行模式空间中,元字符“^”匹配空间中的第一个字条,而不匹配换行符后面的字符。同样,“$”只匹配模式空间中最后的换行符,而不匹配任何嵌入的换行符。在执行next命令之后,控制将被传递给脚本中的后续命令。

Next命令与next命令不同,next输出模式空间的内容,然后读取新的输入行。next命令不创建多行模式空间。

下面这个例子演示N命令的功能

[root@localhost ~]# cat test 
one two three
test redhat nata
tom jerry lisi

111 222 ABC
[root@localhost ~]# sed '/text/N;s/next\ntom/computer/' test
one two three
test redhat computer jerry lisi

111 222 ABC

在这里插入图片描述

D 多行删除命令

删除命令(d)删除模式空间的内容并导致读入新的输入行,从而在脚本的顶端重新使用编辑方法。删除命令(D)稍微有些不同:它删除模式空间中直到第一个嵌入的换行符的这部分内容。它不会导致读入新的输入行,相反,它返回到脚本的顶端,将这些指令应用于模式空间剩余的内容,我们可以编写一个实现查找一系列空行并输出单个空行的脚本,以看看它们之间的区别。下面的语句使用了删除命令(d) :

[root@localhost ~]# cat test
one two three

test redhat nata


tom jerry lisi



111 222 ABC

// 多行Delete命令原理:当遇到两个空行,只删除第一个空行。当一个空行后面跟有文本,模式空间可以正常输出
[root@localhost ~]# sed '                    
>/^$/{
>N
>/^\n$/D
>} ' test
one two three

test redhat nata

tom jerry lisi

111 222 ABC

H、h、G、g命令

这些命令中的每一条都可以利用一个地址来指定一行或行范围。Hole (h,H)命令将数据移至保持空间、而get (g.G)命令将保持空间的数据移回到模式空间。同一命令的小写字母和大写字母之间的差别是,小字字母命令改写目的缓存区的内容,而大写字母命令追加缓存区的现有内容。
Hold命令用模式空间的内容取代保持空间的内容。get命令用保持空间的内容取代模式空间的内容。
Hole命令在保持空间的内容之后放置一个换行符,且后面跟随模式空间的内容(即使保持空间是空的,换行符也被追加到保持空间中)。Get命令模式空间的内容之后放置一个换行符,且后面跟随保持空间的内容。
交换命令交换两个缓存区的内容,对两个缓存区没有副作用。

命令缩写功能
Holdh或H把模式空间里的行复制和追加到保持空间
Getg或G把保持空间里的行复制和追加到模式空间
Exchangex交换模式空间和保持空间的内容
//one这一行内容放入保持空间,然后覆盖掉模式空间的test这一行
[root@localhost ~]# sed '/one/h;/test/g' test
one two three
one two three
tom jerry lisi
111 222 ABC

//one这一行放入到保持空间,然后追加到test行后
[root@localhost ~]# sed '/one/h;/test/G' test
one two three
test redhat nata
one two three
tom jerry lisi
111 222 ABC

//1这一行放入保持空间后删除,追加到模式空间中
[root@localhost ~]# cat test 
11
22
111
222

[root@localhost ~]# sed '/1/{h;d};/2/G' test
22
11
222
111

x 表示交换莫板块中的文本和缓冲区中的文本

[root@localhost ~]# cat test 
1
2
3
4
5
// 匹配2到保持空间然后删除模式空间内容,匹配3到保持空间然后交换保持空间和模式空间的内容
[root@localhost ~]# sed '
/2/{
h
d
}
/3/{
x
}
' test
1
2
4
5

流控制命令

b 在脚本中将控制转移到另一行

[root@;ocalhost ~]# cat test 
hello jjyy
hello world
hello china world

// 匹配jjyy,继续匹配hello world,当不匹配其中一个时,进入下一个命令
[root@localhost ~]# cat txt 
:top
/jjyy/{
/hello world/b top
s/china/JJYY/
}
[root@localhost ~]# sed -f txt test 
hello JJYY
hello world
hello JJYY world

// 匹配hell,继续匹配hell world,当匹配正确时调转回top
[root@localhost ~]# cat txt 
:top
/hello/{
/hello world/b top
s/jjyy/JJYY/
}
[root@localhost ~]# sed -f txt test 
hello JJYY
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值