2014-10-13 4 views
2

У меня есть много сценариев bash, которые используют выражения perl в пределах grep, чтобы извлечь подстроку между двумя разделителями. Пример:grep substring между двумя разделителями

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

Проблема заключается в том, когда я портировал эти сценарии на платформе работает busybox, «интегрированный» grep не распознает ключ -p. Есть ли чистый способ сделать это, используя grep и regular expressions?

Edit: Там нет perl, sed или awk на этой платформе. Это легкий вес linux.

+2

Есть ли причина, по которой вы не можете использовать Perl? –

+0

на этой платформе нет 'perl', только базовые инструменты, в основном, из' busybox' – Ulrik

ответ

3

Предполагая, что нет более одного вхождения в каждой строке, вы можете использовать

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

С Grep и не -greedy quantifier, вы также можете печатать более одной строки.

6

Вы можете использовать awk с настраиваемыми разделителя полей, как это, чтобы получить тот же результат:

echo 'BeginMiddleEnd' | awk -F 'Begin|End' '{print $2}' 
Middle 
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.

Смежные вопросы