在两个定界符之间搜索子字符串

10

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

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

问题是,当我将这些脚本移植到运行 busybox 的平台时,“集成”的 grep 不认识 -P 开关。是否有一种干净的方法可以使用 grep正则表达式 来解决这个问题?

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


2
你有什么原因不能使用 Perl 吗? - Tom Fenech
那个平台上没有perl,只有基本工具,主要是来自busybox的工具。 - Ulrik
3个回答

15

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

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

3
简要翻译:「稍作解释也无妨 ;)。-F 选项似乎是字段分隔符...但是在 -F 'Begin|End' 中,竖线符号 | 有什么神奇的作用呢?」 - dokaspar

11

假设每行只有一个匹配项,您可以使用

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

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


3
使用内置的参数替换:
# 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

更多的例子在这里

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接