zoukankan      html  css  js  c++  java
  • 《sed的流艺术之四》-linux命令五分钟系列之二十四

    《sed的流艺术之四》-linux命令五分钟系列之二十四

    本原创文章属于《Linux大棚》博客,博客地址为http://roclinux.cn。文章作者为rocrocket。

    为了防止某些网站的恶性转载,特在每篇文章前加入此信息,还望读者体谅。

    ===

    [正文开始]

    上文接《sed的流艺术之三》-linux命令五分钟系列之二十三

    例十 如果设定了很多-e的command,它们的执行顺序是怎样的呢?

    [rocrocket@rocrocket programming]$ cat mysed.txt
    Beijing 2003
    Beijing 2004
    Beijing 2005
    Beijing 2006Beijing 2007
    Beijing 2008
    [rocrocket@rocrocket programming]$ sed -e ‘s/Beijing/London/g’ -e ‘/Beijing/d’ mysed.txt
    London 2003
    London 2004
    London 2005
    London 2006
    London 2007
    London 2008

    后一个-e中包含了删除Beijing所在行,但是最后的结果却是所有行都输出了,其实这就是由执行顺序导致的,第一个-e已经将Beijing都替换成了London了,所以怪不得第二个-e找不到Beijing了。

    例十一 读取一个特定文件的内容,将其插入到本文件指定的地方:

    [rocrocket@rocrocket programming]$ cat ins.txt
    ====China====
    [rocrocket@rocrocket programming]$ cat mysed.txt
    Beijing 2003
    Beijing 2004
    Beijing 2005
    Beijing 2006
    Beijing 2007
    Beijing 2008
    [rocrocket@rocrocket programming]$ sed ‘/2005/r ins.txt’ mysed.txt
    Beijing 2003
    Beijing 2004
    Beijing 2005
    ====China====
    Beijing 2006
    Beijing 2007
    Beijing 2008

    此命令用于在含有2005的行下面插入ins.txt文件的内容。

    例十二 将某些指定行写入到特定文件中

    [rocrocket@rocrocket programming]$ sed ‘/200[4-6]/w new.txt’ mysed.txt
    Beijing 2003
    Beijing 2004
    Beijing 2005
    Beijing 2006
    Beijing 2007
    Beijing 2008
    [rocrocket@rocrocket programming]$ cat new.txt
    Beijing 2004
    Beijing 2005
    Beijing 2006

    看,w new.txt表示将含有2004、2005、2006的行写入到new.txt文件中。

    例十三 使用a在特定行“下面”插入特定内容

    [rocrocket@rocrocket programming]$ cat new.txt
    Beijing 2004
    Beijing 2005
    Beijing 2006
    [rocrocket@rocrocket programming]$ sed ‘/2004/aChina’ mysed.txt
    Beijing 2003
    Beijing 2004
    China
    Beijing 2005
    Beijing 2006
    Beijing 2007
    Beijing 2008

    使用a然后加上需要加的内容即可。

    例十四 使用i在特定行“上面”插入特定内容

    [rocrocket@rocrocket programming]$ sed ‘/2004/iChina’ mysed.txt
    Beijing 2003
    China
    Beijing 2004
    Beijing 2005
    Beijing 2006
    Beijing 2007
    Beijing 2008

    例十五 替换特定字符

    [rocrocket@rocrocket programming]$ cat mysed.txt
    Beijing 2003
    Beijing 2004
    Beijing 2005
    Beijing 2006
    Beijing 2007
    Beijing 2008
    [rocrocket@rocrocket programming]$ sed ‘y/eijng/EIJNG/’ mysed.txt
    BEIJING 2003
    BEIJING 2004
    BEIJING 2005
    BEIJING 2006
    BEIJING 2007
    BEIJING 2008

    使用了y就表示将第一栏的每个字符都替换为相对应的第二栏的字符。

    例十六 对匹配行的下一行进行处理

    [rocrocket@rocrocket programming]$ cat mysed.txt
    Beijing 2003
    Beijing 2004
    Beijing 2005
    Beijing 2006
    Beijing 2007
    Beijing 2008
    [rocrocket@rocrocket programming]$ sed ‘/2004/{n;y/eijng/EIJNG/;}’ mysed.txt
    Beijing 2003
    Beijing 2004
    BEIJING 2005
    Beijing 2006
    Beijing 2007
    Beijing 2008

    这个例子就是找含有2004的行,然后将它下面的一行中的eijng替换为大写的EIJNG。这里面的“n;”起到了“移至下一行”的作用。n背后的含义其实是将下一行放到模式空间中去。

    [rocrocket@rocrocket programming]$ cat mysed.txt
    Beijing 2003
    Beijing 2004
    Beijing 2005
    Beijing 2006
    Beijing 2007
    Beijing 2008
    [rocrocket@rocrocket programming]$ sed ‘/200/{n;y/eijng/EIJNG/;}’ mysed.txt
    Beijing 2003
    BEIJING 2004
    Beijing 2005
    BEIJING 2006
    Beijing 2007
    BEIJING 2008

    这个例子更加典型,你可以发现,BEIJING是隔行出现的。你知道为什么么?不说答案了,相信你能自己思考出来!

    ps:sed的流艺术系列到这里就结束了:)

    ps:其实sed的学问还很大,正则表达式也有很多需要学习的地方,我也在学习中…这个小系列,就当抛砖引玉了,希望对你有用!

    总结下:

    命令格式:

      sed [选项] ‘command’ 文件

      选项:-n,-e,-f

      command命令包括两部分,一部分是指定范围(m,n指定行范围或者正则表达式匹配出要处理的行,也可以不指定而处理所有的行),一部分就是处理命令

      下面是处理命令:

      查找替换:'s/string1/string2/g'      用string2替换string1,可以使用这个正则表达式,g表示global,是可选项

      替换特定字符:‘y/abc/def/’   用def替换对应的abc

      指定行下插入新行:'/m/astring'    将string插入m的下面

      指定行上插入新行:'/m/istring'    将string插入m的上面

      删除行:'/m,n/d'

      打印行:‘/m,n/p’   一般与-n一起使用,打印要处理的行

      插入filename:‘/m,n/r filename’

      导出到filename:‘/m,n/w filename’

      使用sed脚本:sed -n -f jiaoben.sed file

      输入下一行:'/指定行/{n;其他命令;}'   实际上就是将下一行作为当前行然后处理,假设处理行使用的是指针,那么可以理解为将指针向下移动一行,然后处理。  

  • 相关阅读:
    Linux下OpenSSL自签ssl证书
    戌蛤怒触铁铁树
    Python自动化办公-自动化操作Excell-openpyxl
    Python正则表达式
    Django中F查询
    如何知道自家的宽带是多少兆?
    ‘Diango中明明模版的名称写的是对的,但是访问url的时候发现没调用模版’解决方案
    Django中的聚合函数
    Django中的跨关系查询
    【RabbitMQ】零、Windows64位安装
  • 原文地址:https://www.cnblogs.com/qionghua520/p/4385917.html
Copyright © 2011-2022 走看看