2016-06-22 4 views
1

Я написал ниже сценарий, чтобы найти подходящую строку.BASH: проблема с расширенным регулярным выражением

#!/usr/bin/env bash 
str='XX:+UseCMSInitiatingOccupancyOnly' 
echo "str :${str}" 
output=$(jvmmon -pid "$(pgrep java)" -c "print vm information" | grep -Eo "\-$str[^ ]+") 
echo "output : $output" 

Command, jvmmon -pid "$(pgrep java)" -c "print vm information" производят Outout, который содержит строку с именем, как -XX:+UseCMSInitiatingOccupancyOnly, но я не смог получить выход, и он пуст.

Пусть говорят из положить эту команду jvmmon является -XX:+UseCMSInitiatingOccupancyOnly -XX:+CMSClassUnloadingEnabled -XX:+CMSScavengeBeforeRemark -XX:+UseCMSInitiatingOccupancyOnly -XX:+CMSClassUnloadingEnabled -XX:+CMSScavengeBeforeRemark

Примечание: Должен использоваться Grep -E, как и другие параметры зависят от этой логики.

спасибо.

+0

Что желаемый результат 'grep' в этом случае? – GMichael

+0

@GMichael, выход должен быть -XX: + UseCMSInitiatingOccupancyOnly –

+0

Что он вам даст? Вы уже знаете эту строку. – GMichael

ответ

2

У вас есть две проблемы, включая токен +. + - это расширенный шаблон регулярного выражения, соответствующий одному или нескольким символам.

  • В переменной decalaration, у вас есть str='XX:+UseCMSInitiatingOccupancyOnly' и вы используете его в качестве Regex шаблона. Тогда проблема в том, что он будет соответствовать : один или несколько раз, но вы хотите точно сравнить его. Так объявим его как:

    str='XX:\+UseCMSInitiatingOccupancyOnly' 
    
  • В Regex модели, у вас есть [^ ]+ в конце, но входная строка заканчивается в UseCMSInitiatingOccupancyOnly, поэтому не соответствие. Поэтому вам нужно [^ ]*.

Пример:

$ str='XX:\+UseCMSInitiatingOccupancyOnly'       
$ grep -Eo "\-${str}[^ ]*" <<<'-XX:+UseCMSInitiatingOccupancyOnly' 
-XX:+UseCMSInitiatingOccupancyOnly