• sed和awk的简单使用


    平时都用ubuntu,所以处理问题的时候经常都是想到linux下提供的程序。sed和awk是其中两个很强大的工具,用它们来作查找和替换非常方便。

    以下是我最近使用过的几个实际例子

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    #使用脚本中的$VERSION变量替换{VERSION}字串,注意这里得使用双引号
    sed -i "s/{VERSION}/$VERSION/g" $UPDATE_FILE
    #去掉含有updateKey的行
    sed -i "s/.*updateKey.*//" install.rdf
    #替换含有js/core.js?v=1234为<?php HtmlHelper::getJS('1'); ?>#这里正则中的.不用转义,但是(、)、+都需要转
    #后面引用前面正则的子匹配使用1、2、……
    sed -i "s/.*js/(w+).js?v=.*/<?php HtmlHelper::getJS('1'); ?>/g" *
     
    #获得$XPIFILE文件的hash
    HASH=`sha1sum $XPIFILE |awk '{print $1}'`
    #从<em:version>0.1.3</em:version>中获得当前版本号
    VERSION=`awk '/(<em:version>([^<]*)</em:version>)/' install.rdf |awk -F '>' '{print $2}'|awk -F '<' '{print $1}'`

    批量替换以后,如果你使用svn,还可以配合vim来复查替换的结果。我常用的做法是

    1
    2
    xp@xp-notebook:www$ svn di > ~/diff
    xp@xp-notebook:www$ vim ~/diff

    这样可以获得vim的语法高亮,如果能再配合mark插件,那就非常完美了。

    以前在windows中经常使用dreamweaver来作查找替换,但是和linux的工具(grep/sed/awk)相比,速度和效率上就差了很多。

    更新几个例子
    1.找到并删除匹配的行

    1
    2
    #这里找到含有google统计脚本的行并删掉。/<script src=".*urchin.js".*>$/是匹配的正则表达式,d是执行的命令。
    sed -i '/<script src=".*urchin.js".*>$/d' filename

    2.删除找到匹配行的下一行

    1
    2
    #删除包含页脚后面的</div>。这里的n表示往下读下一行。
    sed -i "/<?php include_once( 'footer.php' ); ?>/{ n; /</div>$/d;}" filename

    3.多行匹配和引号转义

    1
    2
    3
    4
    5
    6
    #找到header区块并替换为<?php include_once( 'header.php' ); ?>。
    #:begin 是设定一个begin标记,每个分号代表一个语句结束
    #/<div id="header">/,/</div>$/    reg1,reg2  两个正则表达式限定查找的范围,大括号内为执行的命令。
    # /</div>$/! 非最后匹配行,$!表示非文件最后一行, N表示追加下一行到缓冲区,b begin是跳到begin开始,如此循环直到header区块都在缓冲区。
    #然后执行s/<div id="header">.*logo.*</div>/<?php include_once( 'header.php' ); ?>/; 替换
    sed -i ":begin; /<div id="header">/,/</div>$/ { /</div>$/! { $! { N; b begin }; }; s/<div id="header">.*logo.*</div>/<?php include_once( 'header.php' ); ?>/;     };" filename

    4.awk切分field时括号的转义
    在centos中默认的awk是gawk,而在ubuntu中默认是mawk,可以使用awk –version 或者 awk -W version查看使用什么版本的awk。
    使用mawk直接用\(转义即可,在gawk中使用\\(转义而且是单引号。

    1
    2
    3
    4
    5
    6
    #以下例子是查找abc.css中所有的背景图片(去掉重复的)
    # 只对mawk有效
    grep 'url(\.\.' abc.css |awk -F'url\(' '{print $2}'|awk -F")" '{print $1}'|sort -u
    grep 'url(\.\.' abc.css |awk -F"url\(" '{print $2}'|awk -F")" '{print $1}'|sort -u
    # mawk和gawk都ok
    grep 'url(\.\.' abc.css |awk -F'url\\(' '{print $2}'|awk -F")" '{print $1}'|sort -u
  • 相关阅读:
    服务器安装宝塔面板
    CentOS7操作SSH/SSHD服务(查看/启动/重启/自启)
    CentOS服务器升级Linux版本
    阿里云云服务器漏洞修复
    Linux服务器安装Docker
    服务器安装Nginx
    服务器端简单Demo
    实现博客内容折叠
    [转]珍惜时间,做好规划——致大学过半的你们
    【LeetCode】9. 回文数
  • 原文地址:https://www.cnblogs.com/shihao/p/2318729.html
Copyright © 2020-2023  润新知