【问题标题】:Using sed for extracting substring from string使用 sed 从字符串中提取子字符串
【发布时间】:2017-01-31 18:16:54
【问题描述】:

我刚从做正则表达式开始使用 sed。我想从*****/XXXXXX> 中提取XXXXXX,所以我关注了

sed -n "/^/*/(\S*\).>$/p"

如果我这样做,我会收到以下错误

sed: 1: "/^//(\S).>$/p": 无效命令代码 *

我不确定我在这里缺少什么。

【问题讨论】:

    标签: regex shell sed terminal


    【解决方案1】:

    试试:

    $ echo '*****/XXXXXX>' | sed 's|.*/||; s|>.*||'
    XXXXXX
    

    替换命令s|.*/|| 删除字符串中直到最后一个/ 的所有内容。替换命令 s|>.*|| 删除字符串中第一个 > 中保留到行尾的所有内容。

    或者:

    $ echo '*****/XXXXXX>' | sed -E 's|.*/(.*)>|\1|'
    XXXXXX
    

    替换命令 s|.*/(.*)>|\1| 捕获最后一个 / 和最后一个 > 之间的任何内容并将其保存在第 1 组中。然后将其替换为第 1 组 \1

    【讨论】:

      【解决方案2】:

      如果您有pcre 选项,请使用grep

      $ echo '*****/XXXXXX>' | grep -oP '/\K[^>]+'
      XXXXXX
      
      • /\K 积极的后视 / - 不是输出的一部分
      • [^>]+ > 以外的字符

      【讨论】:

        【解决方案3】:

        在我看来,awk 在这项任务中表现得更好。使用 -F 可以使用多个分隔符,例如“/”和“>”:

        echo "*****/XXXXXX>" | awk -F'/|>' '{print $1}'
        

        当然你可以使用sed,但它更难理解。首先我要删除第一部分(由“/”分隔)和第二部分之后(由“>”分隔):

        echo "*****/XXXXXX>" | sed -e s/.*[/]// -e s/\>//
        

        两者都会带来预期的结果:XXXXXX。

        【讨论】:

          【解决方案4】:
          echo '*****/XXXXXX>' |sed 's/^.*\/\|>$//g'
          XXXXXX
          

          从行首开始,然后继续直到 lask / ALSO find > 后跟 EOL ,如果找到其中任何一个,则将其替换为空白。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 2012-04-09
            • 1970-01-01
            • 2013-05-16
            • 2015-06-07
            • 2017-04-01
            • 2015-05-10
            • 1970-01-01
            相关资源
            最近更新 更多