首页 > 代码库 > sed详解与入门
sed详解与入门
sed,stream editor,流编辑器,输入一段文本,通过处理,得到修改的文本,一个很简单却又很复杂的功能,简单在于只是处理文本,复杂在于需要支持文本处理的全部要求,增删查改等功能。
源文件file,下列操作都是以此文件操作:
first second third first sed
增:
增加一行文字:sed ‘1 a this is a line‘ file;a代表append;
插入一行文字:sed ‘1 i this is a line‘ file;i代表insert;
在行首或行尾增加一个单词:sed ‘s/^/#/‘ file;s代表substitute,^代表行首,$代表行尾;
first this is a line second third first sed
this is a line first second third first sed
#first #second #third #first sed
删:
删除一行文字:sed ‘2 d‘ file;d代表delete;
删除多行文字:sed ‘2,3 d‘ file;2,3代表起始行号和终止行号;
删除某个单词:sed ‘s/first//g‘ file;g代表global;替换全部first为空,如果是数字n,则替换第n个first,如果是数字n和g,如2g,则替换第n个之后的first;
first third first sed
first first sed
second third sed
查:
打印某行:sed -n ‘2 p‘ file;p代表print;
打印多行:sed -n ‘1,2 p‘ file;-n选项代表不输出模式空间的数据(什么是模式空间后面会说);
打印包含某个单词的行: sed -n ‘/first/p‘ file;匹配first,也可以使用正则表达式;
打印包含A单词又包含B单词的行:sed -n ‘{/first/{/sed/p}}‘ file;大括号{}代表嵌套命令,先匹配first,在匹配sed,然后p,或者用d删除等都可以;
打印包含A单词却不包含B单词的行:sed -n ‘{/first/{/sed/!p}}‘ file;感叹号!代表非,反操作;
打印包含A单词的后续几行:sed -n ‘/second/,+1p‘ file;+1代表后续一行;
打印奇数或偶数行:sed -n ‘p;n‘ file;sed -n ‘n;p‘ file;前者奇数行,后者偶数行;分号;代表执行多个sed命令,使用-e选项,如sed -e ‘……‘ -e ‘……‘ file 也有同样效果;至于n命令后面会谈到。
second
first second
first first sed
first sed
first
second third
first third
second fisrt sed
改:
将A修改为B:sed ‘ s/first/one/g‘ file;
将某行从小写转换为大写:sed ‘2 y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/‘ file;y代表yank(猜测与vim的y代表的意思是差不多的);其实就是映射,a映射为A,b映射为B;
替换某行的文字:sed ‘1 c abc‘ file;c代表change;
one second third one sed
first SECOND third first sed
abc second third first sed
以上是sed的一些使用例子,下面谈谈它的其它内容。
pattern space(模式空间)与选项-n
模式空间在sed里对初学者是特别难懂的一个东西,说白了,它就是一个缓冲区,将数据读入缓冲区,在缓冲区处理,并输出缓冲区的内容,这也就是为什么不会修改源文件的内容。
至于选项-n,要求sed不输出缓冲区的内容,大部分都只有打印时才会使用,大致流程如下伪代码:
for line in file //循环读入每行数据 do pattern_space = line //将当前行数据写入模式空间 pattern_space = exec(sed_cmd,pattern_space) //执行sed的命令,并将处理完的数据写回模式空间 if "-n" no exist //如果没有选项-n print pattern_space //则输出模式空间的数据 done
选项-i,直接修改源文件
上述的sed操作执行都不会对源文件作任何改动,相当于copy了一个副本出来操作相应的命令,但如果我们需要直接在源文件上修改,该怎么办,查man会知道,-i选项会使命令在源文件上操作。
地址
在使用sed,命令的格式都类似这样,“1,2s/a//g”,"2p","1,3d","/wo/,+3p","2!p","p";sed处理的数据,都有起始行,到结束行,限定一定的区域,大致的格式是这样,[begin,[end]][!]cmd,begin或end可以由数字或者正则式表示。
n与N
看别人的sed脚步,有时会看到n与N命令,类似这样的,sed -n ‘n;p‘ file,代表输出偶数行,单独的一个p肯定是输出全部的,那多了个n为什么就是偶数行?了解一下n或N命令做了什么事。
n,sed先读取第一行到模式空间,调用n命令,读取第二行,覆盖模式空间;n>模式空间
N,sed先读取第一行到模式空间,调用N命令,读取第二行,追加到模式空间;N>>模式空间
g与G、h与H、x
这几个命令,与另一概念有关,hold space,相当于模式空间的缓冲区,与n/N命令相似,g与h都是覆盖,G与H都是追加;
g: 将hold space中的内容拷贝到pattern space中,原来pattern space里的内容清除
G: 将hold space中的内容append到pattern space\n后
h: 将pattern space中的内容拷贝到hold space中,原来的hold space里的内容被清除
H: 将pattern space中的内容append到hold space\n后
x: 交换pattern space和hold space的内容
举个栗子:
pattern space |
hold space | |
原 | abc | \n |
g | \n |
\n |
G | abc\n |
\n |
h | abc | abc |
H | abc | \nabc |
x | \n | abc |
使用的一些相关正则:
(^):开头
($):结尾
(\<):词首
(\>):词尾
(.):任何单字符
(*):某个字符出现0次或多次
([ ]):字符集合
(&):被匹配的变量
(=):行号