• shell脚本学习笔记 (流编辑器sed)


         sed意为流编辑器(Stream Editor),在Shell脚本和Makefile中作为过滤器使用很普遍,也就是把前一个程序的输出引入sed的输入,经过一系列编辑命令转换为另一种格式输出。

    sed不只支持正則表達式。它另一些比較厉害的功能。

          我给出一个样例,大家看看有什么办法能够解决它吧。

    <html><head><title>Hello World</title>
    <body>Welcome to the world of regexp!</body></html>
    Hello World
    Welcome to the world of regexp!
        上面这个HTML文件中的内容怎么通过sed将它变成以下的没有<>的内容呢?我预计在座的非常少有人可以非常快的将它搞定吧,这是我遇到的一个题目,弄了半小时才搞定的。

    我用到了sed,先将解题思路给出来解解馋吧^_^



      上面的知识一个样例而已,以下要開始介绍sed这款工具的使用了。

    首先sed的运行方式有两种:

    1. sed option 'script' file1 file2 ...
    2. sed option -f scriptfile file1 file2 ...

        能够看到sed支持对多个文件操作,事实上它是一行一行的解析的,就像流水一样,知道运行到文件末尾。它的编辑命令

    为: /pattem/action  当中pattern是正則表達式,action是编辑操作,以下就介绍一下它的简单使用吧。

    1. /pattern/p :打印匹配pattern的行

           注意sed默认的是将待处理的已经处理好的都打印出来,所以上面的结果会反复打印匹配的,所以此时我们须要

    使用 '-n' 选项来打印我们感兴趣的部分。


    2. /pattern/d :删除匹配pattern的行

      

          须要注意的是虽说 'd' 是删除匹配的行,可是它并没有删除文件中面的内容。由于在sed中想要使改动生效,我们

    须要用 '-i' 选项。


    3. /pattern/s/pattern1/pattern2/     :查找符合pattern的行,将该行第一个匹配pattern1的字符串替换为pattern2
    4. /pattern/s/pattern1/pattern2/g   :查找符合pattern的行,将该行全部匹配pattern1的字符串替换为pattern2

           须要注意最后有 'g' 与无的时候的差别,一个字符对整个的影响事实上非常大。


    5. sed -i  : 做的操作会改动原文件

     这个參数的使用要注意。它真的会使改动生效的。想一想已经写好的project,想看看替换一些小地方后的样子,却又不小心

    写错了,结果将整个project的重要代码给替换了,最后想进入project按 ‘U’还原(此时按U还原是无效的),此时你真的有剁手的冲动。


     6.定址

    定址用于决定对哪些行进行编辑。地址的形式能够是数字、正則表達式、或二者的结合。假设没有指定地址,sed将处理输入文件的全部行。

    可是定址也有好几种情况:

     

        上述这样的情况是按行来定位的,能够打印或删除某一行或者多行,用起来比較简单,比如 sed '1,3d' file ,

    sed -n '3p' file , sed -n '2,5p' file 等等。可是以下的情况却是比較复杂的:

        

       

     当中:

    1. sed '/pattem1/,/pantem2/d'  :删除全部包括'pattem1' 和 'pattem2' 的行,以及在他们之间的行,从上

    述样例中能够看出吧。

    2. sde '/patten1/,nd'  : 删除包括 'pattem1' 的行到第 n 行的内容

    以上两点大家须要自己下去多多尝试一下,由于它却是不易理解。


    7.正則表達式

    一開始就说sed支持正則表達式,可是却没实用到,嘿嘿。以下就来使用一下吧。

        (1). '^' ,'$'  

    (2). '.' ,'*' 

         

         

        (3) . '<' 。'>'

         

         


        以下的两种使用方法比較特殊。是sed的特殊功能

        

        上面的语句中是将test保存起来了记为标签1,以后能够使用 '1' 来引用它。

    看的不是非常清楚的话,以下的样例

    会让你明确:

                 

    &:保存查找串以便在替换串中引用:s/[0-9]/*&*/g 符号&代表查找串。这个还是自己去试一试,这样你才会

    更加的熟悉使用方法,以下另一个样例帮助理解。

        

        

    以上就是sed的基本使用方法,sed事实上支持非常多命令和一些选项,比如:

    命令:
    a :在当前⾏行后加入一行或多行。多行时除最后一行外。每行末尾需用“”续行
    c :用此符号后的新文本替换当前行中的文本。

    多行时除最后一行外,每行末尾需用”"续行

    i :在当前行之前插入文本。多行时除最后一行外,每行末尾需用”"续行d删除行
    h : 把模式空间里的内容拷贝到暂存缓冲区(保持空间)
    H :把模式空间里的内容追加到暂存缓冲区(保持空间)
    g :把暂存缓冲区里的内容拷贝到模式空间,覆盖原有的内容
    G:把暂存缓冲区的内容追加到模式空间里,追加在原有内容的后面
    l :列出非打印字符
    p :打印行
    n :读入下一输入行,并从下一条命令而不是第一条命令開始对其的处理
    q :结束或退出sed
    r :从文件里读取输入行
    ! :对所选行以外的全部行应用命令
    s :用一个字符串替换还有一个
    g :在行内进行全局替换
    w :将所选的行写入文件
    x :交换暂存缓冲区与模式空间的内容
    y :将字符替换为还有一字符(不能对正則表達式使用y命令)
    选项:
    -e :进行多项编辑。即对输入行应用多条sed命令时使用
    -n :取消默认的输出
    -f :指定sed脚本的文件名称

    这些选项我并没有一一解说,常常须要使用它的人就再去好好钻研吧。

    至于sed一些高级使用方法,比如在sed中有

    "模式空间"和"状态空间"的概念,应该去了解一下,上面给的命令中一些就是针对这两种空间来操作的,我如今还没

    有研究好,所以就没写出来,望谅解。

  • 相关阅读:
    js动态生成表格
    Android Studio使用小技巧:提取方法代码片段
    Android适配底部虚拟按键的方法
    Eclipse注释模板
    android7.0关于TelephonyManager.getDeviceId()返回null的问题
    在fragment中实现返回键单击提醒 双击退出
    android使用友盟实现第三方登录、分享以及微信回调无反应问题解决办法
    【FastDev4Android框架开发】RecyclerView完全解析之下拉刷新与上拉加载SwipeRefreshLayout(三十一)
    WebView使用详解(二)——WebViewClient与常用事件监听
    android正则表达式隐藏邮箱地址中间字符
  • 原文地址:https://www.cnblogs.com/jhcelue/p/7233594.html
Copyright © 2020-2023  润新知