【问题标题】:grep substring between two delimiters两个分隔符之间的 grep 子字符串
【发布时间】:2014-12-08 10:56:08
【问题描述】:

我有很多bash 脚本在grep 中使用perl 表达式来提取两个分隔符之间的子字符串。示例:

echo BeginMiddleEnd | grep -oP '(?<=Begin).*(?=End)'

问题是,当我将这些脚本移植到运行 busybox 的平台时,“集成”grep 无法识别 -P 开关。有没有使用grepregular expressions 的干净方法?

编辑: 该平台上没有perlsedawk。这是一个轻量级的linux

【问题讨论】:

  • 有什么理由不能使用 Perl?
  • 该平台上没有perl,只有基本工具,主要来自busybox

标签: regex bash perl grep busybox


【解决方案1】:

您可以使用awk 和这样的自定义字段分隔符来获得相同的输出:

echo 'BeginMiddleEnd' | awk -F 'Begin|End' '{print $2}'
Middle

【讨论】:

  • 一点解释也无妨;)。 -F 选项似乎是字段分隔符...但是|-F 'Begin|End' 中的作用是什么?
【解决方案2】:

假设每行不超过一次,您可以使用

sed -nr 's/.*Begin(.*)End.*/\1/p'

使用 grep 和非贪婪量词,您还可以每行打印多个。

【讨论】:

    【解决方案3】:

    使用bash内置参数替换:

    # grab some string from grep output
    f=BeginMiddleEnd
    middleend=${f/Begin/}    # do some substitution to lose "Begin"
    
    echo $middleend
    MiddleEnd
    
    beginmiddle=${f%%End}    # strip from right end to lose "End"
    echo $beginmiddle
    BeginMiddle
    

    加载更多示例here

    【讨论】:

      最近更新 更多