尚观第15周sed学习笔记

注: 本文档中的代码和图片均来自《sedawk(第二版)》

 

一 文本的操作

sed是一个“非交互式的”面向字符流的编辑器,awk是一种负责模式匹配的程序设计语言,

它的典型示例是将数据转换成格式化的报表。

 

二 了解sed awk的基本操作

范例一:file1.txt

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

用Massachusetts替换MA

$ sed's/MA/Massachusetts/' file1.txt

使用多重指令

$ sed's/ MA/, Massachusetts/ ; s/ PA/, Pennsylvania/' file1.txt

或者:

$ sed-e 's/ MA/, Massachusetts/' -e 's/ PA/, Pennsylvania/'

file1.txt

脚本:sedsrc

s/MA/, Massachusetts/

s/PA/, Pennsylvania/

s/ CA/,California/

s/VA/, Virginia/

s/OK/, Oklahoma/

 

使用脚本文件

$ sed-f sedsrc file1.txt

 

保存输出

$ sed-f sedsrc file1.txt > newfile.txt

阻止输入行自动显示

$ sed-n 's/MA/Massachusetts/p' file1.txt

 

常见出错信息

‘’不匹配

s/src/dst/缺少最后的“/”

 

使用awk

使用脚本文件

awk-f script files

打印输入文件每行的第一个字段

$ awk'{ print $1 }' file1.txt

打印匹配这种模式的每一行

$ awk'/MA/' file1.txt

限制只输出每条记录的第一个字段

$ awk'/MA/ { print $1 }' file1.txt

改变分隔字符

$ awk-F, '/MA/ { print $1 }' file1.txt

使用多重命令,用“分号”隔开

$ awk-F, '{ print $1; print $2; print $3 }' file1.txt

 

常见出错信息

没有大括号{}将过程括起来

没用单引号’’将指令括起来

没有使用斜杠//slashes 将正则表达式括起来

 

OptionDescription

-f Filename of script follows.

-F Change field separator.

-vvar=value follows.

 

三 了解正则表达式语法Regular Expression

表达式(模式匹配)

算术表达式:

1+23*5 1+2*3 (1+2)*3

特定的模式:

ABCADC AEC … …

ababb abbb abbbb abbbb… …

一个正则表达式描述了一种模式或字符序列

正则表达式的匹配过程

 

元字符

. 匹配除换行符之外的任意单个字符,awk中可以匹配换行符

* 匹配任意一个(包括零个)在它前面的字符

[...]匹配方括号中的任意一个字符,^为否定匹配, -表示字符的范围

^ 作为正则表达式的第一个字符,匹配行的开始。在awk中可以嵌入换行符

$ 作为正则表达式的最后一个字符,匹配行的结尾。在awk中可以嵌入换行符

\{n,m\} 匹配n和m之间的任意次数, \{n\}匹配出现n次。\{n,\}匹配至少出

现n次

\ 转义字符

 

扩展元字符

ExtendedMetacharacters (egrep and awk)

+ 匹配前面的正则表达式的一次出现或多次出现

? 匹配前面的正则表达式的零次出现或一次出现

| 可以匹配前面的或后面的正则表达式(替代方案)

() 对正则表达式分组

{n,m} 匹配出现的n到m次数, {n}匹配出现n次。{n,}匹配至少出现n次,大多数awk都不支持,用于POSIX egrep和POSIX awk

 

 

编写正则表达式的3 个步骤:

1 知道要匹配的内容以及它如何出现在文本中。

2 编写一个模式来描述要匹配的内容

3 测试模式来查看它匹配的内容

 

模式匹配产生的结果:

Hits(命中)

这是我想匹配的行

 

Misses(未命中)

这是我不想匹配的行

 

Omissions(遗漏)

这是我不能匹配但想要匹配的行

 

Falsealarms(假警报)

这是我不想匹配的但却匹配了的行

 

 

字符类

[Ww]hat

\.H[12345]

 

字符的范围

[a-z]

[0-9]

[Cc]hapter[1-9]

[-+*/]

[0-1][0-9][-/][0-3][0-9][-/][0-9][0-9]

 

排除字符类

[^0-9]

 

重复出现的字符

10

50

100

500

1000

5000

[15]0*

[15]00*

 

字符的跨度

* 与 \{n,m\}

电话号码的匹配

[0-9]\{3\}-[0-9]\{7,8\}

 

分组操作

compan(y|ies)

注意:大多数sed 和grep 不能对圆括号()进行匹配,但是在egrep 和

awk 所有版本都是可以的

 

四 编写sed 脚本

模式空间

sed-e ‘s/pig/cow/’ -e ‘s/cow/horse/’

 

寻址上的全局透视(定址)

sed将命令应用于每个输入行,它可以指定零个、一个或两个地址。每个地址

都是一个描述模式、行号或者行寻址符号的正则表达式。

范例file2.txt

.TS

Beijing,CN

.TE

 

Shanghai,CN

guangzhou,CN

shenyang,CN

$ sed'/Beijing/s/CN/China/' file2.txt

 

删除所有的行

d

只删除第一行

1d

使用寻址符号$,删除最后一行

$d

删除空行,正则表达式必须封闭在斜杠//当中

/^$/d

删除.TS 和.TE 标记的tbl 输入

/^\.TS/,/^\.TE/d

删除第五行到结尾所有的行

5,$d

混合使用行地址和模式地址

10

$ sed'1,/^$/d' file2.txt

删除除了那些行以外的行

1,5!d

分组命令

/^\.TS/,/^\.TE/{

s/CN/China/

s/Beijing/BJ/

}

sed'2,3s{/cn/china/;s/a/b/}'  file.txt 同一范围的两个替换可以用大括号括起来一起,中间加分号

 

五 基本的sed 命令

sed 命令的语法

[address]command

行地址对于任何命令都是可选的,它可以是一个模式,或者由斜杠、行号或行寻址符号括住的正则表达式, 大多数sed命令能接受由逗号分隔的两个地址, 有些命令只接受单个行地址

命令还可以用大括号进行分组,第一个命令可以和大括号放在同一行,

但是右大括号必须自己一行

 

替换

[address ]s/pattern /replacement/flags

标志flags是:

n 可以是1-512,表示第n次出现的情况进行替换

g 全局更改

p 打印模式空间的内容

wfile 写入到一个文件file中

 

replacement部分用下列字符会有特殊含义:

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

\n 回调参数

$ cattest1

first:second

one:two

$ sed's/\(.*\):\(.*\)/\2:\1/' test1

second:first

two:one

 

删除

[address]d

删除模式空间的内容,同时改变脚本的控制流,执行这个命令后,在“空

的”模式空间不再有命令执行。删除命令会导致读取新的输入行

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值