用某种模式sed / awk / perl编写正则表达式

时间:2012-03-27 00:21:10

标签: perl sed awk

如何使用以下任何一种方法捕获下面模式的第1组(sed,awk,perl)?

以下行的正则表达式模式为\[(.*)\],我想捕获第1组,表示[]

之间的任何内容
Processing record with rowkey [fdebae87f9b7bcb7f698a0723cd1474b3a84bbb1] with these rules

这是我想要实现的,上面的行是简单的输入。下面是简单的输出:

fdebae87f9b7bcb7f698a0723cd1474b3a84bbb1

问题更新:

实际的样本输入(遗憾的是,不知道有必要,有点复杂):

Processing record with rowkey [fdebae87f9b7bcb7f698a0723cd1474b3a84bbb1] with these rules [[COUNT_ALL]].

4 个答案:

答案 0 :(得分:5)

您遇到贪婪问题。

因此你匹配:

fdebae87f9b7bcb7f698a0723cd1474b3a84bbb1] with these rules [[COUNT_ALL]

而不是:

fdebae87f9b7bcb7f698a0723cd1474b3a84bbb1

请记住:.*匹配是贪心。 (匹配最长的可能范围)

可能的解决方案:

  • 减少贪婪:(不是sed和awk IIRC)
    \[(.*?)\]

  • 以旧方式减少贪婪:
    \[([^\]]*)\]

  • 只匹配单词字符:([A-Za-z_]
    \[(\w*)\]

答案 1 :(得分:2)

$ echo 'Processing record with rowkey [fdebae87f9b7bcb7f698a0723cd1474b3a84bbb1] with these rules' | command_bellowing

SED

$ sed -r 's/.*\[(.*)\].*/\1/'

GAWK

$ gawk '{print gensub(/.*\[(.*)\].*/, "\\1", "g")}'

perl的

$ perl -ne 's/.*\[(.*)\].*/\1/;print'

答案 2 :(得分:0)

正如亚历克斯所说,你抓住了它。如果您想获得结果,请尝试:

s/\[(.*)\]/$1/

答案 3 :(得分:0)

这可能对您有用:

sed 's/^[^[]*\[\([^]]*\).*/\1/' file