sed函数参数及示例
一些心得:
1、sed是流编辑器,处理一行一行的数据,可以将每次读入一行看作*forward_iterator++;
2、forward_iterator == end()时读入,直接退出sed;
3、ps为空时,立即开始下个循环
4、所有与模式相关的操作都是以ps为对象
一些命令在官方指南上的翻译:
d
1.清空ps;2.立即开始下个循环
n
1.如果没有-n参数,打印ps;2.如果不是最后一行,用下一行覆盖ps,否则退出sed
D
如果ps为空,开始下个循环,否则删除ps中第一行(包括\n么),跳过读入新行,开始下个循环。
N
如果不是最后一行,添加\n以及下一行到ps,否则退出sed
函数s表示替换(substitute)文件内字符串。格式:
[address[,address2]]s/pattern/replacement/[flag]
地址可以是数字,可以是pattern,还可以是$(最后一行),单个范围表示满足条件的行,多个范围表示一个闭区间,没有范围表示所有行,地址与后面的函数之间可以有任意多的空白,但是不能是换行
sed -e 's/test/& it' filename
&表示一次正则匹配的全部,仅仅在replacement部分是特殊字符(需要用\转义)
sed -er 's/(have) (a) (test)/[\3 \2 \1]/' #have a test被替换成为了[my car test]
\n 表示前向引用,从1开始,一共9个?
\ 反斜杠,用来转义特殊符号
flag用来控制一些替换情况:
g:替换该行中所有符合的字符串
m(十进制数):替换行内第m个符合的字符串
p:如果有替换发生,完成所有替换后,将数据输出到stdout
sed -ne 's/&&/7/3pg' test #表示从第三次(3)发现&&开始将此后(g)的&&替换成为g,并打印(p),flag没有顺序的要求
w file:将该行出现在stdout数据输出到file(覆盖)
为空:将资料行内第一个符合pattern的字符串以replacement字符串替换
delimiter:默认为/,但除空白,换行符外,任何字符可用作delimiter
函数d表示删除数据行。格式:
[address[,address]]d
将pattern space内符合地址参数的数据删除
将下一笔资料读进pattern space
重新执行sed script
函数a表示将资料添加到文件中(当前行的下一行)。格式:
[address] a\ string 但是在gnu的sed中:[address[, address]] a\ string
string可以与a\同一行,也可以不同行,但是\一定是有的,而且加的内容都是在匹配行的后面一行,注意换行符要用\转义,无论是-e还是-f,eg:(script中的data)
/&&/a\12345\
12234
函数i表示将资料插入文件中(当前行的上一行)。格式:
[address[, address]] i\ string
注意事项与a\相同
函数c表示改变文件中的数据。格式:
[address[,address]]c\ string #用string替换指定行的内容
函数p表示打印出资料。格式:
[address[,address]] p
函数l,除可以将资料中的不可打印字符以ascii码列出之外,其余均和p相同
函数r表示读入其他档案内容到文件中。格式:
[address[, address]] r filename
r后空格可以无限多,文件内容在匹配行的下一行打出,文件不存在就不操作(连空行都不打)
函数w表示将范围内的行覆写到其他文档中。格式:
[address[, address]] w filename
函数y完成translate的作用。格式:
[address[, address]] y /xyz…/abc…/ #一一对应的做变换
函数!表示不执行函数参数
[address[, address]] !函数参数
表示地址范围外的数据执行函数参数
[address[, address]]! 函数参数
[address[, address]] ! 函数参数
同第一个,但
[address[, address]] {! 函数参数}
表示地址范围内的数据不执行函数参数
函数n表示读入下一行资料。格式:
动作为:
(没有-n情况下,输出)
pattern space被覆盖为下一笔资料
执行下一个函数。eg:
sed -ne 'n;p' data #打印偶数行
函数q表示跳离sed。格式
[address]q #匹配address这行也会打印(如果是没有-n),eg:
sed -e '/Linux/q' -f script file #读到Linux时就离开sed,注意-e和-f配合使用
函数#表示后面的文字都是注解,直到换行符为止,多行用\间隔
函数N表示添加下一笔资料在pattern space中。格式:
[address[, address]] N
数据行间以换行符分隔,可以用\n来match,eg:
N;s/\n/ /;p #每两行合并成一行
函数D表示删除pattern space内的第一行资料。格式:
[address[, address]] D
如果ps为空,下个循环;删后如果ps不为空,下个循环不读入记录
函数P表示打印pattern space中的第一行。格式:
[address[, address]] P
sed -n -e 'N' -e 'P' file #打印奇数行
函数h表示将pattern space资料复制给hold space。格式:
[address[, address]] h
函数H表示将pattern space资料附加给hold space。格式:
[address[, address]] H
函数g:h反动作
函数G:H反动作
函数x,交换空间数据
函数b label表示跳转,跳转到:label处,label为空,跳转到末尾
编辑指令 m1
:记号
编辑指令 m2
.
.
.
[address1,[address2]]b [记号]
编辑指令 m3
函数t label表示跳转,跳转到:label处,label为空,跳转到末尾,注意和b的区别(前一个s执行才执行跳转)
编辑指令 m1
:记号
编辑指令 m2
.
.
.
s/.../.../
[address1,[address2]]t [记号]
编辑指令 m3