使用sed/awk/perl编写特定模式的正则表达式

3
以下哪种方式(sed、awk、perl)可以用来捕获下面模式的第一组?
正则表达式模式为\[(.*)\],对于下面的行,我想要捕获第一组,也就是在[]之间的任何内容。
Processing record with rowkey [fdebae87f9b7bcb7f698a0723cd1474b3a84bbb1] with these rules

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

fdebae87f9b7bcb7f698a0723cd1474b3a84bbb1

问题更新:

实际样例输入为(抱歉遗漏了,不知道这很必要且稍微复杂):

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

2
你使用圆括号将它捕获了。例如在Perl中,它将成为$1。你需要让你的问题更清晰:接下来你想用它做什么? - Alex
1
@Alex 你好,我更新了我的问题,现在看起来更清晰了。 - Gandalf StormCrow
4个回答

5

您遇到了贪婪问题。

因此,您正在匹配:

fdebae87f9b7bcb7f698a0723cd1474b3a84bbb1] with these rules [[COUNT_ALL]

改为:

fdebae87f9b7bcb7f698a0723cd1474b3a84bbb1

请注意:.* 的匹配是贪婪的,他会匹配最长的可能结果。

可能的解决方案:

  • 减少贪婪度(不适用于sed和awk):
    \[(.*?)\]

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

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


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'

0

这可能适合你:

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

0

正如Alex所说,你已经抓住了它。如果你想得到结果,请尝试:

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接