Извлечение необязательных значений из строки - PullRequest
2 голосов
/ 05 декабря 2011

Итак, допустим, у меня есть строки:

aaa -Dprop=var Class arg
aaa Class arg

Я хочу одну однострочную строку (perl, sed, awk, не имеет значения), которая может извлекать arg и var(если его там).В частности, я хотел бы вернуть

arg var
arg

Для первого из них работает следующее:

echo "aaa -Dprop=var Class arg" | perl -pe 's|.*(-Dprop=([a-z]*)).*Class (.*)|\3 \2|'

, но поскольку требуется -Dprop=, очевидно, что второе не работаетодин.

Если, однако, я сделаю это совпадение необязательным:

echo "aaa -Dprop=var Class arg" | perl -pe 's|.*(-Dprop=([a-z]*))?.*?Class (.*)|\3 \2|'

оно не будет работать для первого, потому что, я считаю, что эти два. * Являются жадными классификаторами и соответствием -Dpropfirst.

Если я сделаю их нежадными, это все равно не сработает, но я не уверен почему.

echo "aaa -Dprop=var Class arg" | perl -pe 's|.*?(-Dprop=([a-z]*))?.*?Class (.*)|\3 \2|'

Итак, во-первых, какое регулярное выражение я могу использоватьсоответствует правильно?(Я знаю, что могу разделить его на несколько команд, но у меня есть только одна).

Ответы [ 3 ]

2 голосов
/ 05 декабря 2011

Возможно:

echo "aaa -Dprop=var Class arg"|perl -pe 's|(.*-Dprop=(.*))?.*Class\s*(.*)|$3 $2|'

Обратите внимание, что \ 3 лучше записать как $ 3 (что прагма предупреждений разглашает).

1 голос
/ 05 декабря 2011
perl -pe 's|^.*?(?:-Dprop=([\S]+))?\s+Class\s+(.*?)$|\2 \1|'
0 голосов
/ 05 декабря 2011

Это может работать для вас:

echo -e "aaa -Dprop=var Class arg\naaa Class arg"|
sed 's/.*-Dprop=\([^ ]*\).*\( \)Class \([^ ]*\)\|.*Class \([^ ]*\)/\3\2\1\4/'
arg var
arg
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...