【问题标题】:Bash: Regex match betwen first occurrence of charactersBash:第一次出现的字符之间的正则表达式匹配
【发布时间】:2016-05-09 16:42:26
【问题描述】:

输入:

p45-322-16.jpg

期望的输出:

p45

我正在尝试使用 grep 或 awk 或 sed 或可以在 bash shell 上运行的东西制作一个 bash 脚本。

目前我对此感到困惑:

echo "p45-322-16.jpg" | sed 's/\(.*\)-.*/\1/'

输出:

p45-322

【问题讨论】:

    标签: regex linux bash awk sed


    【解决方案1】:

    您可以使用cut 命令:echo "p45-322-16.jpg" | cut -d"-" -f1

    【讨论】:

      【解决方案2】:

      您需要限制您将接受的内容。现在,您使用. 接受了太多,而正则表达式的默认贪婪特性消耗了太多字符。

      尝试将接受的字符限制为仅数字,或明确排除破折号:

      \([0-9]*\).*
      
      \([^-]*\).*
      

      【讨论】:

      • 另一种选择是让您的正则表达式从破折号开始:s/-.*//
      【解决方案3】:
      echo "p45-322-16.jpg" | sed 's/\([^-]*\).*/\1/'
      

      你的正则表达式的.* 部分是贪婪的,所以它尽可能地读取,以便正则表达式仍然匹配。这意味着它声明了直到最后一个 - 的所有内容。

      使用[^-]* 匹配所有内容,直到-。

      【讨论】:

      • 谢谢,很好的解释!
      猜你喜欢
      • 2011-01-02
      • 2016-10-14
      • 1970-01-01
      • 1970-01-01
      • 2022-08-13
      • 2016-03-18
      • 1970-01-01
      相关资源
      最近更新 更多