【问题标题】:Using sed to remove unwanted characters from output使用 sed 从输出中删除不需要的字符
【发布时间】:2014-03-31 11:20:55
【问题描述】:

我在 bash shell 中运行以下命令,试图仅返回 [] 内的十六进制字符和紧随其后的整数值。第一个 sed 调用将替换直到并包括 [ 的所有内容。第二个替换 :]。该命令会产生所需的结果,但是我想在单个 sed 语句中完成此操作,即无需再次通过 sed 管道。我已经尝试了这两个正则表达式的很多组合,但未能找到产生所需结果的组合。

echo 'dot1dTpFdbPort[00:02:6f:d9:16:ca] 12' | sed 's/^.*\[//g' | sed 's/[][\:]//g'
00026fd916ca 12

【问题讨论】:

    标签: regex bash shell sed


    【解决方案1】:

    有这样的吗?

    echo 'dot1dTpFdbPort[00:02:6f:d9:16:ca] 12' | awk '{gsub(/[^[]*\[|]|:/,"")}8'
    00026fd916ca 12
    

    【讨论】:

      【解决方案2】:

      也许您可以尝试将两个正则表达式与一个独特的 sed 命令一起使用:

      echo 'dot1dTpFdbPort[00:02:6f:d9:16:ca] 12' | sed -e 's/^.*\[//g' -e 's/[][\:]//g'
      

      该命令会产生您想要的结果:仅在一个 sed 语句中。

      感谢。

      【讨论】:

      • 可简写为:sed -e 's/^.*\[//g;s/[][\:]//g'
      【解决方案3】:
      echo 'dot1dTpFdbPort[00:02:6f:d9:16:ca] 12' | sed 's/^.*\[//;s/[][\:]//g'
      

      【讨论】:

      • g 在第一个 s 操作不需要
      【解决方案4】:
      echo 'dot1dTpFdbPort[00:02:6f:d9:16:ca] 12' | sed 's/://g;s/.*\[\(.*\)\]/\1/'
      

      类似但基于内容提取

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-04-11
        • 2018-11-17
        • 2011-12-24
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多