sed用法

1、sed的语法格式:

sed在正常情况下,将处理的行读入模式空间(pattern space),脚本中的“sed-command(sed命 令)”就一条接着一条进行处理,知道脚本执行完毕。然后该行呗输出,模式(pattern space)被清 空;接着,在重复执行刚才的动作,文件中的新的一行被读入,直到文件处理完毕。 但是,由于种种原因,如用户希望在某个条件下,脚本中的某个命令被执行或希望模式空间(pattern space)保留,以便下一次使用,这都有可能使sed在处理文件的时候,不按照正常的流程来进行处 理,这时候就需要用sed高级命令来满足需求。

2、sed选项 option

-n 使用安静模式.则只有经过sed特殊处理的哪一行才会被列出来

-e 传送带(前面执行完传递给后面)

-f 跟随脚本文件名

-r 脱意

-i 直接修改读取文件

3、sed命令详解 command

a 新增, a 的后面可以接字串,而这些字串会在新的一行出现(目前的下一行)~

c 取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!

d 删除,因为是删除啊,所以 d 后面通常不接任何咚咚;

i 插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);

p 列印,亦即将某个选择的资料印出。通常 p 会与参数 sed -n 一起运作~

s 取代,通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g

n 读取下一个输入行, 用下一个命令处理新的行

r 从另一个文件读

4、以下是替换标记

g 表示行内全面替换

p 表示打印行

w 表示把行写入一个文件

x 表示互换模快板中的文本和缓冲区中的文本

y 表示把一个字符翻译为另外的字符(不用于正则表达式)

5、元字符集

,匹配符 ^ 锚定行的开始. 如/^sed/ 匹配所有以sed开头的行

$ 锚定行的结束. 如/sed$/ 匹配所有以sed结尾的行

. 匹配一个非换行符. 如/sed/ 匹配s后接一个任意字符然后是d

* 匹配零或多个字符. 如/sed/ 匹配所有模块是一个或多个空格后紧跟sed的行

[] 匹配一个制定范围内的字符如. /[Ss]ed/ 匹配sed和Sed

[^] 匹配一个不在制定范围内的字符. 如/[^A-RT-Z]ed/ 匹配不包含A-R和T-Z的一个字母开头,紧跟ed的行

(..) 保存匹配的字符. 如s/(love)able/\1rs loveable被替换成lovers

& 保存搜索字符用来替换其它字符. 如s/love/&/ love这成love

< 锚定单词的开始. 如/\> 锚定单词的结束. 如/love>匹配包含以love结尾的单词行

x{m} 重复字符x,m次. 如/o{5}匹配包含5个o的行 x{m,} 重复字符x,至少m次. 如 /o{5,}/匹配至少有5个o的行

x{m,n} 重复字符x,至少m次.把多余n次. 如 /o{5,10}/匹配5-10个o的行

6、sed中查找模式匹配

. 单字通配符

[0-9] 匹配0-9

[^a-z] 不匹配a-z的所有其它字符

“.*” 匹配””内任何字符串

^ 匹配行开始

$ 匹配行结束

7、例子

删除: dd命令

sed ‘2d’ file 删除file文件的第2行

sed ‘2,$d’ file 删除file文件的第2行到末尾所有行

sed ‘$d’ file 删除file文件的最后一行

sed ‘/test/’d file 删除file文件所有包含test的行

sed d file 删除file文件中的所有行

替换: s命令

sed ‘s/test/mytest/g’ file 在整行范围内把test替换为mytest. 如果没有g标记,则只有每行第一个匹配 的test被替换成mytest

sed -n ‘s/^test/mytest/p’ file -n选项和p标志一起使用表示只打印那些发生替换的行, 如果某一行开头 的test被替换成mytest,就打印它

sed ‘s/^192.168.1.1/&localhost’ file &符号表示替换字符串中被找到的部分. 所有以192.168.1.1开头 的行都会被替换成它自己加localhost,变成192.168.1.1localhost sed -n ‘s/(love)able/\1rs/p’ file love被标记为1,所有loveable会被替换成lovers,而且替换的行会被打印 出来

sed ‘s#10#100#g’ file 不论什么字符,紧跟着s的命令都被认为是最新的分隔符,所以,’#’在这里是分隔 符,代替了默认的”/”分隔符. 表示把所有10替换成100

选定行的范围: 逗号

sed -n ‘/test/,/check/p’ file 所有在模块test和check所确定范围内的行都被打印

sed -n ‘5,/^test/p’ file 打印从第5行开始到第一个包含以test开始行之间的所有行

sed ‘/test/,/west/s/$/sed test/’ file 对于模块test和west之间的行,每行的末尾用字符串sed test替换

多点编辑: e命令

sed -e ‘1,5d’ -e ‘s/test/check/’ file -e选项允许在同一行里执行多条命令.删除1-5行,check替换test

sed -e ‘/and/s/aaa/bbb’ file sed中用bbb替换同一行中包括字符串and的字符串aaa,而不是每一行中 的字符串aaa 读入文件: r命令

sed ‘/test/r file_a’ file file_a里的内容被读进来,显示在与test匹配的行后面. 如果匹配多行,则file_a内 容将显示在所有匹配行的下面

写入文件: w命令

sed -n ‘test/w file_a’ file file中所包含的test行都被写入file里

插入: i命令

sed ‘/test/i\ new line’ file 如果test被匹配, 则把反斜杠后面的文本插入到匹配行的上面

sed -e ‘1 ia’ -e ‘$ a3′ file 在第一行上面插入a,在末尾行下面插入3

下一个: n命令

sed ‘/test/{n; s/aa/bb/;}; file 如果test被匹配, 则移动到匹配行的下一行,替换这一行的aa变为bb, 并打 印该行,然后继续

sed高级用法:

N命令

先来说说命令n和命令N 命令n:读取下一行到pattern space。由于pattern space中有按照正常流程读取的内容,使用n命令 后,pattern space中又有了一行,此时,pattern space中有2行内容,但是先读取的那一行不会被取 代、覆盖或删除;当n命令后,还有其他命令p的时候,此时打印出的结果是n命令读取的那一行的内 容。

N 命令会将下一行文本内容添加到缓冲区已有数据之后(之间用换行符分隔),从而使前后两个文本行同时位于缓冲区中,sed 命令会将这两行数据当成一行来处理。

[root@localhostl ~]# cat test
John Daggett, 341 King Road, Plymouth MA
Alice Ford, 22 East Broadway, Richmond VA
Orville Thomas, 11345 Oak Bridge Road, Tulsa OK
Terry Kalkas, 402 Lans Road, Beaver Falls PA
Eric Adams, 20 Post ROad, Sudbury MA
Hubert Sims, 328A Brook Road, Roanoke VA
Amy Wilde, 334 Bayshore Pkwy, Mountain View CA
Sal Carpenter, 73 6th Street, Boston MA

//sed 命令查找含有单词 Broadway 的那行文本。找到该行后,它会用 N 命令将下一行合并到那行,然后用替换命令 s 将此行的VA和下面一行的Orville替换成and。结果是,文本文件中的两行在 sed 的输出中成了一行。
[root@localhostl ~]# sed '/Broadway/{N;s/VA\nOrville/and/}' test
John Daggett, 341 King Road, Plymouth MA
Alice Ford, 22 East Broadway, Richmond and Thomas, 11345 Oak Bridge Road, Tulsa OK
Terry Kalkas, 402 Lans Road, Beaver Falls PA
Eric Adams, 20 Post ROad, Sudbury MA
Hubert Sims, 328A Brook Road, Roanoke VA
Amy Wilde, 334 Bayshore Pkwy, Mountain View CA
Sal Carpenter, 73 6th Street, Boston MA

//有时我们不需要讲将两行内容合并,可以使用换行符\n来实现文本原本的格式
[root@localhostl ~]# sed '/Broadway/{N;s/VA\nOrville/and\nTOM/}' test
John Daggett, 341 King Road, Plymouth MA
Alice Ford, 22 East Broadway, Richmond and
TOM Thomas, 11345 Oak Bridge Road, Tulsa OK
Terry Kalkas, 402 Lans Road, Beaver Falls PA
Eric Adams, 20 Post ROad, Sudbury MA
Hubert Sims, 328A Brook Road, Roanoke VA
Amy Wilde, 334 Bayshore Pkwy, Mountain View CA
Sal Carpenter, 73 6th Street, Boston MA

D命令

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

[root@localhostl ~]# cat test1
This is followed 1

This is followed 2


This is followed 3



This is followed 4




This is end

//当有偶数个空行时,所有的空行都会被删除。仅当有奇数个空行时,有一行被保留下来。这是因为删除命令清除的是整个模式空间。一旦遇到第一个空行,就读入下一行,并且两行都被删除。如果遇到第三个空行,并且下一行不为空,那么删除命令就不会被执行,因此空行被输出。
[root@localhostl ~]# sed '/^$/{N;/^\n$/d}' test1
This is followed 1

This is followed 2
This is followed 3

This is followed 4
This is end

//多行Delete命令完成工作的原因是,当遇到两个空行时,Delete 命令只删除两个空行中的第一个。下一次遍历该脚本时,这个空行将导致另一行被读入模式空间。如果那行不为空,那么两行都输出,因此确保了输出一个空行。换句话说,当模式空间中有两个空行时、只有第一个空行被删除。当一个空行后面.跟有文本时,模式空间可以正常输出。
[root@localhostl ~]# sed '/^$/{N;/^\n$/D}' test1
This is followed 1

This is followed 2

This is followed 3

This is followed 4

This is end

P命令

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

[root@localhostl ~]# cat test2
Here are examples of the UNIX
System. Where UNIX
System appears, it should be the UNIX
Operating System

//替换命令匹配“\nSystem” ,并且用“Operat ing\nSystem”取代它。保留换行是很重要的,否则模式空间中就有只一行。注意Print和Delete命令的顺序。
[root@localhostl ~]# sed '
/UNIX$/{
N
/\nSystem/{
s// Operating &/
P
D
}}' test2
Here are examples of the UNIX Operating 
System. Where UNIX Operating 
System appears, it should be the UNIX
Operating System

//如果先删除再打印会这样输出
[root@localhostl ~]# sed '
/UNIX$/{
N
/\nSystem/{
s// Operating &/
D
P
}}' test2
System appears, it should be the UNIX
Operating System

模式空间是容纳当前输入行的缓冲区。还有一个称为保持空间(holdspace)的顶留(set-aside) 缓冲区。模式空间的内容可以复制到保持空间,而且保持空间的内容也可以复制到模式空间。有一组命令用于在保持空间和模式空间之间移动数据。保持空间用于临时存储。单独的命令不能寻址保持空间或者更改它的内容。

保持空间最常的用途是,当改变模式空间中的原始内容时,用于保留当前输入行的副本。影响模式空间的命令有:

命令缩写功能
Hold h或H 将模式空间的内容复制或追加到保持空间
Get g或G 将保持空间的内容复制或追加到模式空间
Exchange x 交换保持空间或模式空间的内容
[root@localhostl ~]# cat test3
1
2
11
22
111
222

//这里的目的是颠倒以1开始的行和以2开始的行的顺序。下面展示了如何使用保持空间:我们将第一行复制到保持空间(它一直在那),这时清除模式空间。然后sed将第二行读入模式空间,并且将保持空间的行追加到模式空间的结尾。
[root@localhostl ~]# sed '
> /1/{
> h      
> d
> }
> /2/{
> G
> }' test3
2
1
22
11
222
111

x命令

x命令是将当前缓存区和模式空间内容互换

[root@localhostl ~]# cat test4
hello world
hello runtime

hehe
xixi

henhen
haha

end

//这个脚本有两个基本部分,相应有各自的地址。如果输入行不是空行则做一件事,如果它是空行则做另一件事。如果输入行不是空行,它就被追加到保持空间(用H) ,然后从模式空间中删除。删除命令阻止行的输出并且清除模式空间。控制转移回脚本的顶端并读取一个新行。总的思想是不输出任何文本行,而将它们收集到保持空间。如果输入行是空行,则处理保持空间的内容。
[root@localhostl ~]# sed '
> /^$/!{
> H
> d
> }
> /^$/{
> x
> s/^\n/<p>/
> s/$/<\/p>/
> G
> }' test4
<p>hello world
hello runtime</p>

<p>hehe
xixi</p>

<p>henhen
haha</p>
posted @ 2021-03-29 18:38  人妖用菊花  阅读(148)  评论(0编辑  收藏  举报