两个分隔符之间的 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 开关。有没有使用grep
和regular expressions
的干净方法?
编辑:
该平台上没有perl
、sed
或awk
。这是一个轻量级的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 子字符串的主要内容,如果未能解决你的问题,请参考以下文章