如何使用以下任何一种方法捕获下面模式的第1组(sed,awk,perl)?
以下行的正则表达式模式为\[(.*)\]
,我想捕获第1组,表示[]
Processing record with rowkey [fdebae87f9b7bcb7f698a0723cd1474b3a84bbb1] with these rules
这是我想要实现的,上面的行是简单的输入。下面是简单的输出:
fdebae87f9b7bcb7f698a0723cd1474b3a84bbb1
问题更新:
实际的样本输入(遗憾的是,不知道有必要,有点复杂):
Processing record with rowkey [fdebae87f9b7bcb7f698a0723cd1474b3a84bbb1] with these rules [[COUNT_ALL]].
答案 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 -r 's/.*\[(.*)\].*/\1/'
$ gawk '{print gensub(/.*\[(.*)\].*/, "\\1", "g")}'
$ perl -ne 's/.*\[(.*)\].*/\1/;print'
答案 2 :(得分:0)
正如亚历克斯所说,你抓住了它。如果您想获得结果,请尝试:
s/\[(.*)\]/$1/
答案 3 :(得分:0)
这可能对您有用:
sed 's/^[^[]*\[\([^]]*\).*/\1/' file