【问题标题】:How to use sed to grab regular expression如何使用sed抓取正则表达式
【发布时间】:2015-12-15 00:52:40
【问题描述】:

我想像这样抓取字符串中的数字:

 "sample_2341-43-11.txt"   to   2341-43-11

于是我尝试了以下命令:

echo "sample_2341-43-11.txt" | sed -n -r 's|[0-9]{4}\-[0-9]{2}\-[0-9]{2}|\1|p'

我看到了这个答案,这就是我的想法。 Use sed to grab a string,但是在我的机器上不行:

  • 它给出错误“非法选项-r”。
  • 它也不喜欢\1

我在 MacOSX 优胜美地上使用 sed。

这是从文件名中提取信息的最简单方法吗?

【问题讨论】:

  • 你不需要 \1 来表示你正在寻找的表达式
  • -r 仅适用于 GNU sed(bash 附带的那个)不是吗?

标签: regex bash sed osx-yosemite


【解决方案1】:

您需要设置分组并匹配该行的其余部分以将其与组一起删除。此外 - 不需要转义。 -n 将禁止输出(它只返回脚本条件的退出级别)。

echo "sample_2341-43-11.txt" | sed -r 's/^.*([0-9]{4}-[0-9]{2}-[0-9]{2}).*$/\1/'

【讨论】:

【解决方案2】:

增强的正则表达式是 Mac 版 sed 中的not supported

您可以改用grep

echo "sample_2341-43-11.txt" | grep -Eo "((\d+|-)+)"

输出

2341-43-11

【讨论】:

    【解决方案3】:
    echo "one1sample_2341-43-11.txt" \
     | sed 's/[^[:digit:]-]\{1,\}/ /g;s/ \{1,\}/ /g;s/^ //;s/ $//'
    
    1 2341-43-11
    
    • 提取所有以- 完成的数字(数字)(因此此处允许--12,但可以轻松处理)
    • posix 兼容
    • 所有行号都在同一行(如果有多个),由空格字符分隔(如果需要,可以更改为新行)

    【讨论】:

      【解决方案4】:

      你也可以试试这个方法

      sed 's/[^_]\+_\([^.]\+\).*/\1/' <<< sample_2341-43-11.txt
      

      输出:

      2341-43-11
      

      说明:

      [^_]\+       - Match the content untile _ ( sample_)
      \([^.]\+\)   - Match the content until . and capture the pattern (2341-43-11)
      .*           - Discard remaining character (.txt)
      

      【讨论】:

        【解决方案5】:

        你可以按照上面海报所说的去做。好吧,利用这个

        pattern "\d+-\d+-\d+" 将匹配您正在寻找的内容。在此处查看演示

        https://regex101.com/r/kO2cZ1/3

        【讨论】:

        • 我相信 \1 是对他的匹配组的引用。
        猜你喜欢
        • 2019-12-13
        • 2021-05-21
        • 1970-01-01
        • 1970-01-01
        • 2018-11-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多