grep substring between two delimiters

2019-02-26 05:11发布

I have a lot of bash scripts that use perl expressions within grep in order to extract a substring between two delimiters. Example:

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

The problem is, when I ported these scripts to a platform running busybox, 'integrated' grep does not recognize -P switch. Is there a clean way to do this using grep and regular expressions?

Edit: There is no perl, sed or awk on that platform. It's a lightweight linux.

3条回答
Viruses.
2楼-- · 2019-02-26 05:55

Use bash built-in parameter substitution:

# 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

Loads more examples here.

查看更多
淡お忘
3楼-- · 2019-02-26 05:58

You can use awk with custom field separator like this to get same output:

echo 'BeginMiddleEnd' | awk -F 'Begin|End' '{print $2}'
Middle
查看更多
我想做一个坏孩纸
4楼-- · 2019-02-26 06:08

Assuming there's no more than one occurrence per line, you can use

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

With grep and non-greedy quantifier you could also print more than one per line.

查看更多
登录 后发表回答