通过LFS学linux命令之sed

LFS-book-6.3的5.7节中有一条命令

 
gcc -dumpspecs | sed 's@^/lib/ld-linux.so.2@/tools&@g' \
> `dirname $(gcc -print-libgcc-file-name)`/specs

命令解释:
   注:所有双引号都用来强调字符串或字符,不包括双引号本身在内。
   gcc 的-dumpspecs参数用来打印构建编译程序的规范信息,同时不采取任何动作。所打印的信息是一个比较长的列表,包括用来编辑、汇编和连接GCC的编译程序自身用到的所有的选项(包括默认选项) 。
   然后通过 "|" 经管道程序传送给sed命令作为要处理的输入文件。然后sed从输入的文件中每次提取一行匹配模式"^/lib/ld-linux.so.2"(即匹配字符串"/lib/ld-linux.so.2",且此字符串要求在行首),然后将匹配成功的字符串附加到"/tools"的后面,然后再用附加后的字符串"/tools/lib/ld-linux.so.2"替换最开始匹配的 "^/lib/ld-linux.so.2"。并将每行中出现的所有"^/lib/ld-linux.so.2"都进行上述动作。
   最后通过shell提供的重定向操作符">"将输出后的内容重定向到GCC的specs文件(GCC的一个配置文件)中。后面的dirname...是产生一个路径名。gcc的-print-libgcc-file-name选项是输出函数库libgcc.a的全路径名称。
  
sed命令详解:
   个人觉得上面这条sed命令很具有典型性,在网上看了不少关于sed这个流编辑器的使用方法的,大多都是告诉你sed有几个命令,几个选项,几个功能,那些东西太多了,至少对于制作LFS的人来说太多了。这里主要详细记录一下上面涉及到的sed的相关用法。完整而高深的讲解可以参考《sed@awk》(第二版)这本书,里面从sed的历史起源说起,能浏览一下那部分内容对于想我这样的刚开始接触linux的人来说会很有帮助。一些简明的用法Google就好了。
    1、sed命令的命令。
    sed当然是起始的动作命令了,输入文件是从管道中的到的gcc的构建信息,而第一点要说明的就是单引号之后的那个字母's',这个字母's'是sed的一个命令,即sed命令的一个子命令,是一个替换命令,默认情况下是用于类似"sed 's/xxx/yyy/'这样的命令,就是将输入文件中的每一行的第一个"yyy"替成"xxx"。注意是第一个,而"sed 's/xxx/yyyg' "中最后的一个字母'g'也是sed的一个命令,这个命令用于将所有出现的"yyy"替换成"xxx"。
    最后是"&"命令,这个命令可以用来附加字符串的内容,就像上面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"在行首,所以匹配上了,于是继续进行匹配。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值