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字符串的行,并删除它。
- sed
- Sed
- SED
- sed
- sed
- sed
- sed
- sed
- sed
- Sed
- sed
- sed
- sed
- sed
- sed
- sed
- sed
- sed
- ORACLE中Drop table cascade constraints之后果
- Oracle Data Guard 主库报--RFS Possible network disconnect with primary database
- 哲哲发烧了
- BW:什么是权限变量:Authorization
- 几行py代码
- Sed
- 解决Eclipse不提示问题
- bat 的妙用
- SQL前一天、前一个月、前一年写法
- VMware三种网络模式根本区别
- 关于有功 无功 感性 容性 母线电压一系列问题的探讨
- java基础
- 一个简单的com组件的实现
- Gedit 有用插件介绍