sed与awk学习笔记(二)

一、sed的基本命令

1.1、sed基本语法

[address]command

例如

sed '1,3d' abc

删除文件abc的第1至3行

 还可以用大括号让多个命令作用于一个地址

[address]{
command1
command2
command3
}

左大括号可以和地址放在一行,右大括号必须独立一行

多个命令在同一行时可以用分号进行分隔

sed '1p;3d' abc

打印第1行并删除第3行

1.2、sed的替换

替换的基本语法

[address]s/pattern/replacement/flags

这里的flags有一下几种

n   为1-512之间的一个数字,表示当文本中匹配出现第n次时进行替换

g   表示对全部匹配进行替换,没有g的话通常只替换第一个匹配

p   打印匹配空间的内容

W file    将模式空间写入file中

在replacement中,也存在元字符

&   表示用正则表达式的内容进行替换

\n   其中n为数字,表示pattern中第n个\(...\)的内容

\   为转义符

举例:编辑文件test

12345
12334

测试&

sed 's/23/*&*/g' abc

输出结果

1*23*45
1*23*34

例子中&代表前面pattern中的'23'

测试\n

sed 's/1\(2\)3\(4\)/*\1/g' abc

输出结果

*25
12334
sed 's/1\(2\)3\(4\)/*\1^\2/g' abc

输出结果

*2^45
12334


1.3、sed的删除
删除使用d命令,删除是找到匹配的行就删除整一行,不允许在被删除行上再做其他操作,不能仅仅删除一个词

1.4、sed的插入、追加、更改

追加

[lineaddress]a追加内容

插入

[lineaddress]i插入内容

更改

[lineaddress]c更改内容

追加会在匹配行后面一行追加内容

插入是在匹配行前面一行插入内容

更改是把匹配行内容全部变成更改内容

1.5 转换

[address]y/abc/ABC/

把匹配行中abc字符转换成ABC,例如

执行上面命令,可以把a123b456c789转换成A123B456C789

二、sed高级命令

基本命令都属于单行操作,高级命令涉及多行模式

测试文本list

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, Moutain View CA
Sal Carpenter, 73 6th Street,Boston MA

2.1 读入下一行命令N

例如现在要把第二、第三行之间的换行符替换成空格,即第二、第三行合并成一行

sed '2N;s/\n/ /' list

这个命令N读入下一行,就等于两行数据都在被操作的空间中,否则一次只能操作一行,是找不到换行符的。N这个命令是多行模式的基础,多行模式的其他命令也是建立在它之上的

2.2 多行删除命令D

和单行删除的d不同,举个例子就清楚了

假设文本abc

a

(1行空行)

b

(2行空行)

c

(3行空行)

d

这种情况下,如果用sed "/^$/N;/^\n$/d"则得到结果是

a

(1行空行)

b

c

(1行空行)

d

结果是双数行被删除,单数行没被删除

如果把命令换成sed "/^$/N;/^\n$/D"则结果是

a

(1行空行)

b

(1行空行)

c

(1行空行)

d

因为D命令只会删除符合规定的第一行,保留剩下的行。与d命令不同,D命令执行后,会返回到脚本的第一行执行,而d命令则是按脚本顺序一直执行下去。所以删除多行的时候大概是这样一个过程:先读入第一行,匹配空行,然后执行N读入第二行,匹配两个都是空行,然后删除第一行,接着从文本第二行开始执行脚本的开头,匹配空行,然后执行N读入第三行,匹配两个都是空行,删除第二行,接着从文本第三行开始执行脚本的开头

2.3 多行打印命令P

和命令D类似,打印通过N读入多行文本中的第一行,N、P、D通常配合进行使用

2.4 保持空间

除了模式空间之外,还存在保持空间,通过命令h或H可以把当前模式空间内容复制或追加到保持空间中,通过g或G把保持空间内容复制或追加模式空间

小写字母和大写字母的区别在于,小写字母为覆盖内容,大写字母为追加内容

测试文本

1

2

11

22

111

222

输入脚本

发布了39 篇原创文章 · 获赞 5 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/sadoshi/article/details/71601557
今日推荐