zoukankan      html  css  js  c++  java
  • regular expression (如何用Sed和正则表达式提取子字符串) ege

    https://blog.csdn.net/zl87758539/article/details/77481679

    sed -i “s?.+?progpathprogpathprog_exe?” config/Daemon.xml
    其中:
    .+ 表示任意字符
    类似的还有:w+ 匹配包括下划线的任何单词字符
    ? 是分隔符,一般用/, 但如果正则中包含/, 则再用/作为分隔符,就需要转义,而且阅读不太直观;

    sed中用()括号括起来的正则匹配的子内容,可以用到替换字符串中,用1,2…来表示,
    还可以用$来表示整个匹配的内容。


    echo "mv u3_yunying.war   u3_yunying.war_`date +%Y%m%d%H%M`" | sed "s/(mv) (w*.war)   (w*.war_w*)/1/g"

    echo "mv u3_yunying.war   u3_yunying.war_`date +%Y%m%d%H%M`" | sed "s/(mv) (w*.war)   (w*.war_w*)/1 2 /tmp/3/g"


    echo "mv a1_a.war" | sed "s/(mv) (w)/2/g"


    echo "tar -zcvf tomcat" | sed  "s/tar -zcvf /tar -zcvf /tmp//g"

     echo "tar -zcvf tomcat" |sed 's/(tar) (-zcvf) ([a-zA-Z]+)/3/g'


    如何用Sed和正则表达式提取子字符串

    现在有如下一串字符串:

        "asdfkjasldjkf"shiner"df

     

    需求:

         需要提取出shiner子字符串。


    命令如下:

    [root@localhost /]$  echo "asdfkjasldjkf"shiner"df" | sed 's/(.*)"(.*)"(.*)/2/g'

    shiner

    命令解释

    s: 表示替换命令

    (.*)" : 表示第一个引号前的内容

    "(.*)":表示两引号之间的内容

    )"(.*):表示引号后的内容

    2: 表示第二对括号里面的内容

    括号里的表达式匹配的内容,可以用1,2等进行引用,第n个括号对内的内容,就用 引用。

     

    这个命令的意思是:

    用2代表的第二个括号的内容(shiner)去替换整个字符串,这样就得到了我们所需要的子字符串了。

     

     


    sed命令可以替换给定文本中的字符串。它可以利用正则表达式进行匹配。

        $ sed ‘s/pattern/replace_string/’ file

        Sed命令也可以从stdin中读取输入,如:

        $ cat file | sed ‘s/pattern/replace_string/’

        使用-i选项,sed可以将替换结果应用于原文件,如:

        $ sed –i ‘s/text/replace/’ file

        以上sed命令会将每一行中第一处符合样式的内容替换掉,如果要替换每一行中的所有内容,可在命令尾部加上参数g,如:

        $ sed ‘s/pattern/replace_string/g’ file

        选项/Ng可以忽略前N-1处匹配,并从第N处开始替换,如:

        $echo thisthisthisthis | sed ‘s/this/THIS/3g’

        thisthisTHISTHIS

        字符/在sed命令中作为定界符使用,其实任意字符都可以当作定界符,如:

        $ sed ‘s:text:replace:g’

        $ sed ‘s|text|replace|g’

        当定界符出现在样式内部时,我们必须使用前缀对它进行转义。

        /pattern/d会移除匹配样式的行,我们可以利用这个移除文件空白行:

        $ sed ‘/^$/d’ file

        在sed中,用&标记匹配样式的字符串,例如:

        $ echo this is an example | sed ‘s/w+/[&]/g’

        [this] [is] [an] [example]

        正则表达式w+匹配每一个单词,&对应于之前所匹配到的单词。

        Sed命令也可以匹配给定样式中的子串。(pattern)用于匹配子串。模式被包括在使用斜线转义过的()中。对于匹配到的第一个子串,其对应的标记是1,匹配到的第二个子串是2,往后依次类推。例:

        $ echo this is digit 7 in a number | sed ‘s/digit ([0-9])/1/’

        This is 7 in a number

        这条命令将digit 7替换为7。样式中匹配到的子串是7。下面是包含多个匹配的例子:

        $ echo seven EIGHT | sed ‘s/([a-z]+) ([A-Z]+)/2 1/’

        EIGHT seven

        ([a-z]+)匹配第一个单词,([A-Z]+)匹配第二个单词,1和2用来引用它们。

        Sed命令还可以组合多个表达式,如利用管道组合多个sed命令的方法可以用以下方式代替:

        $ sed ‘expression1’ | sed ‘expression2’

        这等价于

        $ sed ‘expression1; expression2’

        Sed表达式通常用单引号来引用。不过也可以使用双引号。双引号会通过对表达式求值来对其进行扩展,例如:

        $ text=hello

        $ echo hello world | sed “s/$text/HELLO/”

        HELLO world

     

        Sed应用(我工作中碰到的问题):

        应用1有这样一个文件,每行的格式为:

    type1=value1   type2=value2   type3=value3…

        其中type类型个数未知,每种type之间以’ ’隔开,要求提取出=右边的value,输出格式为:

    value1      value2      value3…

        value之间以’ ’隔开。

    解决方案:用sed语句将=左边的字符替换成空串。

    $sed –r ‘s/[^ ]*://g’ file

        其中-r选项表示使用扩展的正则表达式

     

    应用2有这样一个文件,每行的格式为:

    {type}:value      t3     t4…

        其中value与t之间以’ ’隔开,要求将type和value提取出来,输出格式为:

    type value         t3     t4…

        各数据之间以’ ’隔开。

    解决方案:用sed语句将{type}:替换为type ,使用子串替换的方法。

    $ sed ‘s/{(w+)}:/1 /g’ file

  • 相关阅读:
    (原)Lazarus 异构平台下多层架构思路、DataSet转换核心代码
    (学)新版动态表单研发,阶段成果3
    (学) 如何将 Oracle 序列 重置 清零 How to reset an Oracle sequence
    (学)XtraReport WebService Print 报错
    (原)三星 i6410 刷机 短信 无法 保存 解决 办法
    (原) Devexpress 汉化包 制作工具、测试程序
    linux下网络配置
    apache自带ab.exe小工具使用小结
    Yii::app()用法小结
    PDO使用小结
  • 原文地址:https://www.cnblogs.com/SZLLQ2000/p/9103256.html
Copyright © 2011-2022 走看看