两个分隔符之间的grep子字符串

时间:2014-10-13 19:24:04

标签: regex bash perl grep busybox

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

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

问题是,当我将这些脚本移植到运行busybox的平台时,集成了&#39; grep无法识别-P开关。有没有一种干净的方法可以使用grepregular expressions

来执行此操作

编辑: 该平台上没有perlsedawk。它是轻量级linux

3 个答案:

答案 0 :(得分:6)

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

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

答案 1 :(得分:3)

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

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

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

答案 2 :(得分:0)

使用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