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

Posted

技术标签:

【中文标题】两个分隔符之间的 grep 子字符串【英文标题】:grep substring between two delimiters 【发布时间】: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 【参考方案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。

【讨论】:

以上是关于两个分隔符之间的 grep 子字符串的主要内容,如果未能解决你的问题,请参考以下文章

如何在Java中将字符串子串到第二个点(。)?

求字符串不同子串个数

PB中取字符串子串的函数是啥

PB中取字符串子串的函数是啥

带有字符串子字符串的SwiftUI 5.5初始化数组? [关闭]

如何更改python字符串子字符串信息