sed用法

sed用法
sed的元字符有
.*[]^${}\+?|()
元字符用法:
除^外,其他符号在[]内如果要匹配自己本身字符要加\,否则是元字符的意义。^在[]内开头表示否定,在[]内的其他地方表示本身字符
\(<expresion>\) 括号的分组用法
\{1,4\} 限制次数的用法
*   前面的字符0个或多个
\+  前面的字符1个或多个
&   在替换域中使用表示整个匹配部分,如s/hat/"&"/,&表示前面两个/之间部分

注意在sed中每次处理一行,所以如果没有用N命令用\n是没有意义的
sed 执行前模式空间什么都没有,保留空间也是什么都没有,追加到模式空间时前面先加个\n。所以sed 'G'能使得文件中的各行用空行隔开。
sed的执行流程:
a)开始时,把第一行读入模式空间。
b)把命令逐一应用到模式空间,如果没有其他控制干预,则所有命令执行完后就会到达脚本尾部,这时输出模式空间的内容,然后清除模式空间。
c)读入下一行(永远记住当前行是模式空间中行号最大的那行,特别是用到N命令和控制流程改变时往往很容易搞错下一行是什么),重复b)过程。
上面说的“其他控制干预”包括标号的跳转,D命令。D命令删除模式空间中的第一个\n之前(包括这个\n)的所有内容,保留第一个\n之后的内容,然后返回脚本开始处。
(有些死循环导致不能到达脚本最后,死循环中又没有用p,P命令,这时有内容输出是由于一些命令有立刻输出模式空间的功能(如n输出模式空间的内容然后读入下一行而不用返回脚本顶端)。最好还是不要依赖sed的自动输出了,自己显式p吧)
s替换命令,p,d都是对模式空间的内容进行操作。P命令输出模式空间中第一个\n(包括此\n)之前部分。

[[:alpha:]]匹配任意字母字符,大写或小写
[[:alnum:]]匹配任意字母数字字符,相当于[0-9A-Za-z]
[[:blank:]]匹配空格或制表字符
[[:digit:]]匹配数字,相当于[0-9]
[[:lower:]]相当于[a-z]
[[:upper:]]相当于[A-Z]
[[:print:]]匹配任意可打印字符
[[:punct:]]匹配标点符号
[[:space:]]匹配任意空白字符,包括空格、制表符、NL、FF、VT、CR
sed一些常用选项:
-n  抑制自动输出(用命令p,P输出)
-i  直接修改文件内容

gawk程序能够识别扩展正则表达式(ERE),但sed不能。
gawk一般不支持次数限制符,但加上--re-interval选项就就能支持,如下例
echo "bet" | gawk --re-interval '/be{1,2}t/{print $0}'

sed '/begin/,/end/d' file1  #输出删除了含begin的行到含end的行之间所有行(包括含begin和含end的这两行)的file1的内容
#要注意的是如果file1如下,则从another line include begin到最后一行都会删掉
the line include begin
...
the line include end
...
another line include begin
...(这些行都不含end)
the last line of file

#第5行换为

How are you?

data be deleted

sed '5c\How are you?\
data be deleted!
' file1


#删除html标签,注意不要写成sed 's/<.*>//g'否则<title>head<title>会整行删除
sed 's/<[^>]*>//g' file.html
#插入多行的例子
sed '1i\
this is one line.\
this is another line.' file1

#把y命令把123分别对应到456进行字符替换,不能限定对字符特定出现次数进行变换
echo "this 1 is a test of 1 try." | sed 'y/123/456/'
返回
this 4 is a test of 4 try.

#{{{ letter中的内容如下,
would the following people:
LIST
please report to the office.
#people的内容如下
zhangsan
lisi
wangwu
#以下命令吧文件people内容替换到letter中LIST的位置
sed '/LIST/{
r people
d
' letter
#}}}

#{{{ data1文件内容如下
this is the header file.

this is a data line.

this is the last line.
#用以下语句执行后,n 表示当前匹配行的下一行
sed '/header/{
n
d
}' data1
#输出
this is header line.
this is the data line.

this is the last line.
#}}}

#{{{以下语句把文件data4中的System Administrator替换成Desktop User,如果这个短语跨行也照样替换。N表示把下一行合并的当前行一起处理
sed '
s/System Administrator/Desktop User/
N
s/System\nAdministrator/Desktop\nUser/
' data4
#}}}

#{{{ 删除文件多余的空行,即原来只有一个空行就不变;如果有多个空行就用一行空行代替
sed '/^$/{

N

/^\n*$/D

}' file

#}}}

 


#{{{ 删除文件开头的空行
sed '/./,$!d' file  #这句的意思是从第一行有字符的行到行尾不执行d命令,之前的所有行都执行d
#}}}

#{{{ 删除文件结尾的空行
sed '{
:start
/^\n*$/{$d; N; b start}
}' file #这句如果遇到中间的空行,由于未到最后一行,不执行d。执行N合并下一行,跳回start,若刚加入模式空间的这行不是空行,这时/^\n*$/不匹配,后面的命令都不执行,直接到达脚本尾部,输出模式空间内容,清除模式空间。所以除非遇到文件末尾的空行否则文件内容不变照样输出。
#如果遇到文件末尾第一个空行,但未到最后一空行,d不执行,N合并下一空行,模式空间多了一空行。返回start,仍然匹配/^\n*$/,继续合并下一空行,重复...当到达倒数第二空行时,d仍不执行,N合并了下一空行(模式空间中包含了文件最后一空行行),这时当前行就是最后一行,返回start,匹配/^\n*$/继续成功后,d就会执行,这个模式空间中所有合并的空行都被清除,执行N,但是当前行已经是最后一行了,N执行失败,直接跳到脚本尾部,这时输出模式空间的内容(空)。所以最终在终端上看到的是去除了文件末尾所有空行的情况。
#}}}

#{{{ 逗号分隔长整数
sed '{
:start
s/\([0-9]\+\)\([0-9]\{3\}\)/\1,\2/
t start
}' file #只有上一个匹配成功,t命令才跳转
#}}}

#{{{以下这段sed脚本用来删除dong所在行的上一行,删除dong所在行的下一行很简单这里就不写了
#保存为test.sed,然后执行sed -n -i -f test.sed file就可以应用在file上
:start h
$p
n
/dong/b k1
x
p
x
b start
#}}}
#{{{在倒数第二行之前插入dong
:start h
n
$!{
x
p
x
b start
}
x
i\
dong
p
x
p
#}}}

#以下这段sed脚本输出文件中含"jia"行的上下邻近行的内容
:k1
h
n
/jia/{
x
p
x
$!N
p
}
b k1



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值