文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>sed基本用法总结

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的时候结束。而且有多少个这样的区间就匹配多少次。

问题:

  

排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载