所以,让我说我有字符串:
aaa -Dprop=var Class arg
aaa Class arg
我想要一个可以提取arg
和var
(如果它在那里)的单行(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|'
那么,首先,我可以正确使用哪些正则表达式匹配? (我知道我可以将它分成多个命令,但我只想拥有一个)。
答案 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