Sed

来源:互联网 发布:记录资金曲线软件 编辑:程序博客网 时间:2024/03/29 05:32

此文是网上找来,稍微修改点,估计有错误,欢迎大家参考!

===================================

sed命令详解:
   个人觉得上面这条sed命令很具有典型性,在网上看了不少关于sed这个流编辑器的使用方法的,大多都是告诉你sed有几个命令,几个选项,几个功能,那些东西太多了,至少对于制作LFS的人来说太多了。这里主要详细记录一下上面涉及到的sed的相关用法。完整而高深的讲解可以参考《sed@awk》(第二版)这本书,里面从sed的历史起源说起,能浏览一下那部分内容对于想我这样的刚开始接触linux的人来说会很有帮助。一些简明的用法Google就好了。
    1、sed命令的命令。
    sed当然是起始的动作命令了,输入文件是从管道中的到的gcc的构建信息,而第一点要说明的就是单引号之后的那个字母's',这个字母's'是sed的一个命令,即sed命令的一个子命令,是一个替换命令,默认情况下是用于类似"sed 's/xxx/yyy/'这样的命令,就是将输入文件中的每一行的第一个"xxx"替成"yyy"。注意是第一个,而"sed 's/xxx/yyy/g' "中最后的一个字母'g'也是sed的一个命令,这个命令用于将所有出现的"xxx"替换成"yyy"。
    最后是"&"命令,这个命令可以用来附加字符串的内容,就像上面LFS中的例子一样。这个命令的含义是用正则表达式匹配的内容进行替换。也就是用第一个分隔符中匹配成功的字符串替换调"&"。也即如果发现有"/lib/ld-linux.so.2"在行首,则"/tools&"就变成了"/tools/lib/ld-linux.so.2",
    2、sed的分隔符
    默认情况下sed的分隔符是"/",所以上面的例子"sed 's/xxx/yyyg' "用了"/"做分隔符,但是sed的分隔符可以是很多字符,包括基本所有的可见字符(包不包括元字符?这个我没找到具体的说明)。sed的命令's'后紧跟的第一个字符就是sed的分隔符。所以在LFS的例子中,要改变的是一个路径名,而路径名中又包括默认的"/",所以使用了"@"做为sed的分隔符。当然也可以用默认的"/"做分隔符,不过要用转义字符"/"将默认分隔符"/"转义为普通字符。也即上面的例子写成下面的形式也是可以的
    sed 's/^//lib//ld-linux.so.2///tools&/g'  :)挺晕的
   所以在这种情况下改变分隔符是个比较好的选择
    3、元字符
    由于sed是遵循正则表达式的流编辑器,即是通过正则表达式来进行模式匹配的。所以有元字符的概念,而上面的例子中"^"就是一个元字符,用来表示一样的开始,所以"^/lib/ld-linux.so.2"这个模式是匹配的出现在行首的"/lib/ld-linux.so.2"字符串。
    举例来说就是如果当前行是"/lib/abcd"这个字符串,且其位于行首,则先用"^"进行匹配,因为"/lib/abcd"在行首,所以匹配上了,于是继续进行匹配。

              

补充
   再来看一下在LFS-book-6.3的其他利用sed的例子
  1、5.9节
   sed 's:/usr/local/bin:/bin:' configure.bak > configure
  通过上面解释,这条语句就很好理解了就是将configure.bak中的每行出现的/usr/local/bin替换成/bin,然后重定向到configure文件中。唯一有点不同的是这里的分隔符用的是":",个人估计LFS的作者也是很随意,没什么固定的分隔符,想起用哪个就用哪个。
  2、5.11节
   sed 's@/./fixinc/.sh@-c ture@' gcc/Makefile.in.orig > gcc/Makefile.in
   这个和5.7节的例子的分隔符是一样的,都是"@",有所区别的是这里用到了转义字符,"."(点号)是一个元字符,所以要想搜索"./fixinc.sh"这个模式,就必须用转义字符"/"。另外附加一点,就是在gcc/Makefile.in.orig中就一处用到了这个模式,大概在3193行,不同的机器可能数量和位置都不同,我仅就我个人的机器来说。所以说手动修改也不麻烦。
  3、5.11节
   sed 's/^XCFLAGS =$/& -fomit-frame-pointer/' gcc/Makefile.in.tmp > gcc/Makefile.in
   这个sed的分隔符是默认的"/",也用到了命令"&"和元字符"^",这些在上面都有提到,这里又新出现一个字符"$",这个dollar符号也是一个元字符,表示一行的结尾,即这个要匹配的模式是一行中只有"XCFLAGS ="的这样一行,且这个字符串出现在行首,"="后面也不能有任何东西。其他的替换和5.7节的例子是一样的。
    

补充

  1、5.29节
  sed -i 's@/usr/include@/tools/include@g' configure
  这个sed命令多了一个选项'-i',这个选项是用来直接修改文件,即输入文件和输出文件是一个文件,这样就不用想上面的例子一
 样,先要备份原始文件做输入文件,然后再将输出文件重定向到要修改的文件。不过这样也存在安全隐患,一旦修改错误,原始文件就再也回不来了。
  2、6.7.1节
  sed -i '/scsi/d' include/Kbuild
  这条命令使用了d命令,用于删除定位到的行,而定位是根据前面给出的正则表达式来进行的,即找到含有scsi字符串的行,并删除它。

原创粉丝点击