从字符串中提取可选值

时间:2011-12-05 15:25:59

标签: regex perl sed

所以,让我说我有字符串:

aaa -Dprop=var Class arg
aaa Class arg

我想要一个可以提取argvar(如果它在那里)的单行(perl,sed,awk,无关紧要)。具体来说,我想返回

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|'

它不适用于第一个因为,我相信这两个。* s是贪婪的限定符并且首先匹配-Dprop。

如果我让他们不贪心,它仍然不起作用,但我不确定为什么。

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

那么,首先,我可以正确使用哪些正则表达式匹配? (我知道我可以将它分成多个命令,但我只想拥有一个)。

3 个答案:

答案 0 :(得分:2)

也许:

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

另外请注意\ 3最好写成$ 3(警告pragma会泄漏)。

答案 1 :(得分:1)

perl -pe 's|^.*?(?:-Dprop=([\S]+))?\s+Class\s+(.*?)$|\2 \1|'

答案 2 :(得分:0)

这可能对您有用:

echo -e "aaa -Dprop=var Class arg\naaa Class arg"|
sed 's/.*-Dprop=\([^ ]*\).*\( \)Class \([^ ]*\)\|.*Class \([^ ]*\)/\3\2\1\4/'
arg var
arg
相关问题