【问题标题】:Extracting optional values from a string从字符串中提取可选值
【发布时间】:2011-12-06 05:04:42
【问题描述】:

所以,假设我有字符串:

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

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

【问题讨论】:

  • +1 哇,有人在发布之前实际上已经尝试过编写一些代码! ;-) 祝你好运。
  • "-Dprop=" 是固定的还是可以是任何 "foo=yourVar"?
  • @Kent,-Dprop 是固定的,var 可以是任何东西(但是是特定格式)

标签: regex perl sed


【解决方案1】:

也许:

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

还要注意 \3 最好写成 $3 (警告编译指示会泄露)。

【讨论】:

  • 总体+1,但可能需要进行更多调整:如果存在$2,它将包含Class 之前的任何空格。
  • 我所需要的只是这个概念。那行显然不是我正在解析的确切行。我从没想过在可选匹配中包含第一个通配符。
【解决方案2】:
perl -pe 's|^.*?(?:-Dprop=([\S]+))?\s+Class\s+(.*?)$|\2 \1|'

【讨论】:

    【解决方案3】:

    这可能对你有用:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-04-03
      • 2019-01-30
      • 2018-11-28
      • 1970-01-01
      相关资源
      最近更新 更多