【问题标题】:How to use sed/grep/cut to extract numericals between two brackets?如何使用 sed/grep/cut 提取两个括号之间的数字?
【发布时间】:2015-03-11 14:17:59
【问题描述】:

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

   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

有什么想法吗?

【问题讨论】:

  • awk -F'[()]' '{print $(NF-1)}' file.txt
  • 你想要的输出分配的逻辑是什么?一旦你知道了,就是把它翻译成正则表达式
  • 最后的数字序列是实际结果,是通过模拟发现的。这就是我要提取的内容。
  • fedorqui 的意思是:这里的逻辑是:打印最后一个括号() 的内容就行了。知道了之后,写正则表达式就很容易了。

标签: regex bash sed grep cut


【解决方案1】:

你可以使用这个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 - 在输入中只输出匹配的字符串

【讨论】:

  • 如何修复 \([\d\s?]+\)(?:.(?!\([\d\s]+\)))+$ 以匹配最后一次出现的 (numbers and spaces)
  • grep -oP '.*\(\K[\d\s]+(?=\))' file 和@MarounMaroun 你的意思是没有\K 吗?或者这个grep -oP '(?<=\()[^()]*(?=\)[^)]*$)' file
  • @AvinashRaj 是的,我正在尝试使用否定的lookbehind 来匹配此模式的最后一次出现:(numbers or/and spaces)(包括括号)。
  • @MarounMaroun:如果您想避免 \K 获得相同的输出,请使用:grep -oP '(?<=\()(\d+\s*)*(?=\))' file
【解决方案2】:

使用 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

【讨论】:

  • 测试这个:echo '100330 (map g (10 range 1 1000)) (2 4 6)' | grep -oP '\(\K[0-9 ]+'
  • 没有指定这种情况。
  • 是的,但标题说:在两个括号之间提取数字?(顺便说一句,我没有投反对票,只是在讨论)
猜你喜欢
  • 2012-10-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-18
  • 2013-08-15
  • 1970-01-01
  • 2017-03-19
相关资源
最近更新 更多