随笔 - 56, 文章 - 0, 评论 - 0, 引用 - 0
数据加载中……

《LInux与Unix Shell编程指南》笔记之sed命令

                                                                     Sed命令
    需要注意的地方:
    一、输出重定向到其他文件;
    二、在用sed命令操作的时候并没有对源文件进行修改,可以把sed的输出结果重定向到其他文件来保存最新内容;
    
    sed命令格式:
    sed [options] '{command}' [filename]
    下面是最常用的命令:
    替换命令
    单条替换命令。即对文件或行作一处修改。
    格式为:
    sed [option] 's/old_value/new_value/' [filename]
    把old_value这个字符或字符串替换为新的字符或字符串。
    举例如下:
    [root@localhost test]# echo "I can do it" | sed 's/I/You/' 
    You can 
do it
    这里使用了管道,所以没有使用filename。
   
    多条替换命令。即对文件或行作多处修改。
    方法一:
    利用-e选项。格式为:
   sed [options] -'s/old_value/new_value/' -'s/old_value/new_value/'...  filename
    举例如下:
    [root@localhost test]# echo "I can do it" | sed -'s/I/You/' -'s/it/them/'
    You can 
do them
    方法二:
    利用分号。格式为:
    sed [options] 's/old_value/new_value/;s/old_value/new_value/;...' [filename]
    注意:
    斜线与分号之间没有空格。
    举例如下:
    [root@localhost test]# echo "I can do it" | sed 's/I/You/;s/it/them/'
    You can 
do them
    但是我在斜线与分号之间有个空格,输出一样:
    [root@localhost test]# echo "I can do it" | sed 's/I/You/; s/it/them/'
    You can 
do them
    留待考究。
    方法三:
    前提必须知道的是sed的command部分,sed靠识别完整的单引号来判断命令是否完成输入,所以直到第二个单引号
出现之前sed的输入不会结束。所以可以如下完成:
    sed [options] '<Enter>
    >s/old_value/new_value/
    
>s/old_value/new_value/
    ...
    
>s/old_value/new_value/' [filename]
    举例如下:
    [root@localhost test]# echo "I can do it" | sed '
    > s/I/You/
    
> s/it/them/'
    You can do them
    多条替换命令之全局修改:
    先看这个例子:
    [root@localhost test]# cat sh_test2
    two 
1
    two 
1 two 1
    two 
1 two 1 two 1
    [root@localhost test]# sed 
's/two/three/' sh_test2
    three 
1
    three 
1 two 1
    three 
1 two 1 two 1
    如上面所述,只是修改了每行的第一个匹配的字符串,如果修改全部即全局修改的话要在斜线后面加个g,如:
    [root@localhost test]# sed 's/two/three/g' sh_test2
    three 
1
    three 
1 three 1
    three 
1 three 1 three 1
    g(global)表示全局的意思。
   
    有限制的替换命令
    指满足一定条件的才进行替换修改。
    先准本一个文档作为例子:
    [root@localhost test]# cat sh_test
    I can 
do it!
    You can 
do it!
    We can 
do it!
    把"can"修改为"should",加个限制条件是,替换当且仅当出现在"I"后面的"can",命令为:
    [root@localhost test]# sed '/I/ s/can/should/' sh_test
    I should 
do it!
    You can 
do it!
    We can 
do it!
    改进版:
    [root@localhost test]# sed '
    > /I/ s/can/could/
    
> /You/ s/can/should/
    
> /We/ s/can/must/' sh_test
    I could do it!
    You should 
do it!
    We must 
do it!
    开始的时候提到过,源文件并没有修改,如果要保存sed命令的结果的话需要重定向到其他文件,如:
    [root@localhost test]# sed '
    > /I/ s/can/could/
    
> /You/ s/can/should/
    
> /We/ s/can/must/' sh_test > sh_test1
    [root@localhost test]# cat sh_test1
    I could 
do it!
    You should 
do it!
    We must 
do it!
    
    限制行
    即是说,sed命令限制在某行当中进行编辑。例如:
    [root@localhost test]# cat sh_test
    I can 
do it!
    You can 
do it!
    We can 
do it!
    [root@localhost test]# sed 
'1,2 s/can/could/' sh_test
    I could 
do it!
    You could 
do it!
    We can 
do it!
    上面的例子限制在第1和2行进行修改。同理,sed '1 s/can/could/' sh_test将只修改第1行的can。
   
    禁止显示
    由上面的例子都可以看到,每次输出都会有修改后的结果显示,即使是重定向到其他文件,在这里可以禁止显示这些结
果。只需在options中加入-n即可。例如:
    [root@localhost test]# sed -'1,2 s/can/could/' sh_test
    [root@localhost test]# 
    但是要注意一点的是,-n会被一条显示命令 -p覆盖。例如,先修改test_1:
    [root@localhost test]# cat test_1
    
/I/ s/can/should/p
    
/You/ s/can/could/
    
/We/ s/can/must/p
    其中,第2行没有添加p,按前面所说的话,第2行将不能显示出来,1,3行能显示,如下:
    [root@localhost test]# sed --f test_1 sh_test
    I should 
do it!
    We must 
do it!
    可以这样做,再修改test_1,修改结果如下:
    [root@localhost test]# cat test_1
    
/I/ s/can/should/p
    
/You/ s/can/could/p
    然后再运行一次:
    [root@localhost test]# sed --f test_1 sh_test
    I should 
do it!
    You could 
do it!
    这样做的目的是什么呢?可以发现在test_1中要修改的地方都加了-p,所以跟-n搭配起来可以输出修改的内容,没
有被修改的内容没有显示出来,所以在上面还可以这样:
    sed --f test_1 sh_test > sh_test_out
    把被修改的内容重定向的其他文件中保存。

    删除命令
    删除的时候是删除整行,但是如果想删除一个单词的话可以应该用空的内容来替换,而非删除整行。
    格式为:sed '{what to find} d' [filename]
    如:
    [root@localhost test]# cat sh_test1
    I could 
do it!
    You should 
do it!
    We must 
do it!
    [root@localhost test]# sed 
'/You/ d' sh_test
    I can 
do it!
    We can 
do it!
    删除含有"You"字符串的行。
    [root@localhost test]# sed '1,2 d' sh_test
    We can 
do it!
    删除第1行到第2行。
    其余还应注意这几条:
    删除空白行:sed '/^$/ d' {filename}
    删除以two开头的行:sed 
'/^two/ d' sh_test
    删除以two结尾的行:sed 
'/two$/ d' sh_test
    其通常的用途是删除一个标题。以下命令将删除文件中所有的行,从第一行直到第一个空行:
    sed '1,/^$/ d' {filename}
    删除的另一种格式为:sed '{what to find} !d' [filename]
    表示出了满足{what to find}的内容之外的行都删除,如:
    [root@localhost test]# sed '/You/ !d' sh_test
    You can 
do it!
    
    添加和插入文本
    注意添加和插入的区别,先举例如下:
    添加:
    [root@localhost test]# sed '2a Add the string' sh_test
    I can 
do it!
    You can 
do it!
    Add the 
string
    We can 
do it!
    插入:
    [root@localhost test]# sed '2i Insert the string' sh_test
    I can 
do it!
    Insert the 
string
    You can 
do it!
    We can 
do it!
    可以看出,在第2行添加和在第2行插入是不同的。
    除此之外,可以在文件开头和末尾添加,命令分别为:
    sed '^a {what}' [filename]
    和
    sed '$a {what}' [filename]

    使用脚本文件
    把[command]部分存为脚本,命令sed通过-f来调用。因此可以通过调用脚本文件来减少输入程序。
    格式为:
    sed -f [sed_script_name] [filename]
    其中sed_script_name为脚本文件名。
    例如:
    [root@localhost test]# cat test_1
    
/I/ s/can/should/
    
/You/ s/can/could/
    
/We/ s/can/must/
    [root@localhost test]# cat sh_test
    I can 
do it!
    You can 
do it!
    We can 
do it!
    [root@localhost test]# sed 
-f test_1 sh_test
    I should 
do it!
    You could 
do it!
    We must 
do it!
    
    读写文本
    在这里是指除重定向到其他文件的方法。从文件1中找出符合条件的内容添加到新建的文件2中。
    比如:
    [root@localhost test]# sed -'1,3 w sh_test3' sh_test
    [root@localhost test]# cat sh_test3
    I can 
do it!
    You can 
do it!
    We can 
do it!
    
    修改内容命令
    在这里注意修改内容的方式与删除的方式差不多,作用的对象都是整行。例如:
    [root@localhost test]# sed '/You/ c The string in this line was changed!' sh_test 
    I can 
do it!
    The 
string in this line was changed!
    We can 
do it!
    如此可知,它与替换是完全不同的。
   
    提前结束命令的运行
    即是说当满足条件的时候就不往下执行。sed默认读取整个文件,即达到末尾的时候才停止。
    例如,执行完前2行之后退出:
    [root@localhost test]# sed '
    > /I/ s/can/could/
    
> /You/ s/can/should/
    
> /We/ s/can/must/
    
> 2q' sh_test
    I could do it!
    You should 
do it!
    sed利用这一点可以指定读取的行数,如只读取前两行:
    [root@localhost test]# sed 2q sh_test
    I can 
do it!
    You can 
do it! 

posted on 2011-02-21 19:44 八路 阅读(1254) 评论(0)  编辑 收藏 引用 所属分类: 嵌入式linux笔记


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理