sed基本用法总结
时间:2010-11-21 来源:taosk
Sed的基本用法
Sed的三种命令格式:
sed [options] 'command' file(s)
sed [options] -f scriptfile file(s)
Sed [options] 'command' [address] {
Command
Command
.......
} file
Sed的基本选项--options
要是man的话可以看到有很多选项,这里仅列举下常用到的:
-e command, --expression=command
允许多台编辑,可以看后面的例子
-i [SUFFIX], --in-place[=SUFFIX]
在文件中直接修改,这个很实用。
-h, --help
打印帮助,并显示bug列表的地址。
-n, --quiet, --silent
取消默认输出。
-f, --filer=script-file
引导sed脚本文件名。
-V, --version
打印版本和版权信息。
Sed的命令 --command
Sed的命令有25个,统计如下:
a\
在当前行后面加入一行文本。其实这个\可以没有,只不多有的时候结构更明确,易读。
b lable
分支到脚本中带有标记的地方,如果分支不存在则分支到脚本的末尾,这个主要在sed脚本中实用,在sed的高级用法当中会有介绍。
c\
用新的文本改变本行的文本。
d
从模板块(Pattern space)位置删除行。
D
删除模板块的第一行。
i\
在当前行上面插入文本。
h
拷贝模板块的内容到内存中的缓冲区。
H
追加模板块的内容到内存中的缓冲区
g
获得内存缓冲区的内容,并替代当前模板块中的文本。
G
获得内存缓冲区的内容,并追加到当前模板块文本的后面。
l
列表不能打印字符的清单。
n
读取下一个输入行,用下一个命令处理新的行而不是用第一个命令。
N
追加下一个输入行到模板块后面并在二者间嵌入一个新行,改变当前行号码。
p
打印模板块的行。
P(大写)
打印模板块的第一行。
q
退出Sed。
r file
从file中读行。
t label
if分支,从最后一行开始,条件一旦满足或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。
T label
错误分支,从最后一行开始,一旦发生错误或者T,t命令,将导致分支到带有标号的命令处,或者到脚本的末尾。
w file
写并追加模板块到file末尾。
W file
写并追加模板块的第一行到file末尾。
!
表示后面的命令对所有没有被选定的行发生作用。
s/re/string
用string替换正则表达式re。
=
打印当前行号码。
#
把注释扩展到下一个换行符以前。
以下的是替换标记
g表示行内全面替换。
p表示打印行。
w表示把行写入一个文件。
x表示互换模板块中的文本和缓冲区中的文本。
y表示把一个字符翻译为另外的字符(但是不用于正则表达式)
Sed中支持的正则表达式元字符:
锚定行的开始 如:/^sed/匹配所有以sed开头的行。
$
锚定行的结束 如:/sed$/匹配所有以sed结尾的行。
.
匹配一个非换行符的字符 如:/s.d/匹配s后接一个任意字符,然后是d。
*
匹配零或多个字符 如:/*sed/匹配所有模板是一个或多个空格后紧跟sed的行。
[]
匹配一个指定范围内的字符,如/[Ss]ed/匹配sed和Sed。
[^]
匹配一个不在指定范围内的字符,如:/[^A-RT-Z]ed/匹配不包含A-R和T-Z的一个字母开头,紧跟ed的行。
\(..\)
保存匹配的字符,如s/\(love\)able/\1rs,loveable被替换成lovers。
&
保存搜索字符用来替换其他字符,如s/love/**&**/,love这成**love**。
\<铆钉单词的结尾
>定单词的结束,如/love\>/匹配包含以love结尾的单词的行。
\b 单词分界线,和上面的两个有基本相同的效果。
x\{m\}
重复字符x,m次,如:/0\{5\}/匹配包含5个o的行。
x\{m,\}
重复字符x,至少m次,如:/o\{5,\}/匹配至少有5个o的行。
x\{m,n\}
重复字符x,至少m次,不多于n次,如:/o\{5,10\}/匹配5--10个o的行。
Sed中的常用命令举例说明:
打印p命令和-quiet命令:
Sed '/alibaba/p' file
这时候会打印整篇file,并在匹配alibaba的行下面打印一个相同的行;
Sed -n '/alibaba/p' file
=sed -quiet '/alibaba/p' file
这时候加上-n命令的话就只打印匹配的行了,所以p命令一般会加上-n选项;
删除d命令:
sed '/alibaba/d' file
-----删除file文件中含有alibaba的行。
sed '2,$d' file
-----删除file文件的第二行到末尾所有行。
替换s命令:
sed 's/test/mytest/g' example
-----在整行范围内把test替换为mytest。如果没有g标记,则只有每行第一个匹配的test被替换成mytest。
sed -n 's/^test/mytest/p' example
-----(-n)选项和p标志一起使用表示只打印那些发生替换的行。也就是说,如果某一行开头的test被替换成mytest,就打印它。
sed 's/^192.168.0.1/&localhost/' example
-----&符号表示替换换字符串中被找到的部份。所有以192.168.0.1开头的行都会被替换成它自已加localhost,变成192.168.0.1localhost。
sed -n 's/\(love\)able/\1rs/p' example
-----love被标记为1,所有loveable会被替换成lovers,而且替换的行会被打印出来。
sed 's#10#100#g' example
-----不论什么字符,紧跟着s命令的都被认为是新的分隔符,所以,“#”在这里是分隔符,代替了默认的“/”分隔符。表示把所有10替换成100。
选定行的范围:逗号
sed -n '/test/,/check/p' example
-----所有在模板test和check所确定的范围内的行都被打印。
sed -n '5,/^test/p' example
-----打印从第五行开始到第一个包含以test开始的行之间的所有行。
sed '/test/,/check/s/$/sed test/' example
-----对于模板test和west之间的行,每行的末尾用字符串sed test替换。
追加a命令:
Sed '/^alibaba/a\\
---->the alibaba is a good company!!!<-------'file
-------在匹配的后面追加一行
替换c命令:
--------主要是替换匹配的整行,用法和a命令相同。
在当前行上面插入i命令
------这个也和a命令类似,只不过其添加的内容在匹配行的上面而已!!
从文件读入r命令:
sed '/test/r file' example
-----file里的内容被读进来,显示在与test匹配的行后面,如果匹配多行,则file的内容将显示在所有匹配行的下面。
写入文件:w命令
sed -n '/test/w file' example
-----在example中所有包含test的行都被写入file里
下一行命令n:
Sed '/alibaba/{n;s/taoshoukun/good boy/;}' file
-----如果匹配到aibaba,那么就移动到该行的下一行,在找出这行的taoshoukun进行操作。
变形y命令:
这个命令也很重要,相当于shell中tr那个命令办到的事:
Sed'1,3/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/' file
----将1到3行中所有的小写字母变成大写字母,在这里注意不能使用元字符。
退出q命令:
这个命令一般用到的很少了。
Sed '2q' file
打印完第二行以后就退出sed
Sed '/alibaba/{s/tao/MM/;q;}' file
保持h命令:
Sed -e '/alibaba/{h}' -e '$g' file
将最后一行替换成alibaba匹配的那行
Sed -e '/alibaba/{h}' -e '$G' file
在最后一行追加
注意:在当有多个匹配行的时候会一次的覆盖,取最新匹配的,还有点就是,其后面调用g 的地址不能比匹配的那行靠前,要不然会是空。
互换x命令:
Sed -e '/alibaba/h' -e '/tao/x' file
Tao这个匹配行用alibaba那行替换,然后将tao匹配的这行放到缓存中,留以后g调用。
Sed 对列进行处理:
大家都知道sed对行处理的功能强大,但对列处理的能力就一般了,但不是绝对不能,下面举一个例子说明:
原文:Alibaba is a good company!
要求将第一列和第二列调换一下:
Sed 's/^\(\w*\) \(\w*\) /\2 \1/g' file
这个是我 自己想到的,不知道是否有更好的方法,就抛砖引玉吧!!!
补充:
1。 在sed中用/alibaba/,/tao/来匹配地址的时候,是从出现第一个alibaba开始记,然后到出现第一个tao的时候结束。而且有多少个这样的区间就匹配多少次。
问题: