如何使用sed / grep / cut来提取两个括号之间的数字?

时间:2015-01-13 15:12:45

标签: regex bash sed grep cut

我有一个结果如下的文件:

   7499 (map g (range 1 1000)),(2 2 4 4 4 4 4 4 4)
   50 (map g (range 1 1000)),(2 2 4 4 4 4 4 4 42)
   50 (map g (range 1 1000)),(2 2 4 4 4 4 4 4 29)
   41 (map g (range 1 1000)),(2 2 4 4 4 4 4 4 11)
   23 (map g (range 1 1000)),(2 2 4 4 4 4 4 4 4)
   3 (map g (range 1 1000)),(2 2 4 4 4 4 4 4 5)
   100330 (map g (range 1 1000)),(2 2 4 4 4 4 4 4 6)

我对sed很新,但还没有设法得到我想要的输出,我希望如此:

2 2 4 4 4 4 4 4 4
2 2 4 4 4 4 4 4 42
2 2 4 4 4 4 4 4 29
2 2 4 4 4 4 4 4 11
2 2 4 4 4 4 4 4 4
2 2 4 4 4 4 4 4 5
2 2 4 4 4 4 4 4 6

有什么想法吗?

2 个答案:

答案 0 :(得分:3)

您可以使用此grep

grep -oP '\(\K(\d+\s*)*(?=\))' file
2 2 4 4 4 4 4 4 4
2 2 4 4 4 4 4 4 42
2 2 4 4 4 4 4 4 29
2 2 4 4 4 4 4 4 11
2 2 4 4 4 4 4 4 4
2 2 4 4 4 4 4 4 5
2 2 4 4 4 4 4 4 6

<强>解释

  • \( - 匹配文字(
  • \K - 重置比赛
  • (\d+\s*)*匹配0个或更多个数字组合,后跟0或更多空格
  • (?=\)) - 预见确保后面跟着文字)
  • -P - 在grep中使用PCRE正则表达式
  • -o - 仅在输入中输出匹配的字符串

答案 1 :(得分:1)

使用GNU grep:

grep -oP '\(\K[0-9 ]+' file

输出:

2 2 4 4 4 4 4 4 4
2 2 4 4 4 4 4 4 42
2 2 4 4 4 4 4 4 29
2 2 4 4 4 4 4 4 11
2 2 4 4 4 4 4 4 4
2 2 4 4 4 4 4 4 5
2 2 4 4 4 4 4 4 6