【问题标题】:Sed Capturing Repeating Number GroupsSed 捕获重复数字组
【发布时间】:2019-09-25 11:25:17
【问题描述】:

我正在尝试使用 sed 来捕获类似这些示例的组:

123123 (i would want the first group 123)
144144 (I would want the group 144)

但是 sed 似乎没有意识到 \1 是什么。

有没有办法使用 sed 来做到这一点?之后我想用特定的字符串替换第一组。

([0-9]+)\1 

我已经尝试过使用上面的正则表达式,sed 似乎没有意识到我想要做什么。

也试过这个:

~/Desktop$ cat file
123123
23231
12323
123231
12345
144144
~/Desktop$ sed -n 's/.*\b\([[:digit:]]\{1,\}\)\1\b.*/\1/p' file
~/Desktop$ 

~/Desktop$ sed -n -E 's/([0-9]+)\1/specificstring\1/p' file
specificstring12323
specificstring2323
specificstring12323
specificstring14444

~/Desktop$ sed -nE 's/^([0-9]+)\1([^0-9]|$)/\1/p' file
2323
12323

【问题讨论】:

  • sed 到底发出了什么?你究竟是如何调用sed的?
  • 如果一行中没有组怎么办?请从示例中发布一些示例行。见minimal reproducible example
  • sed 在两个示例中都只发出数字 1,如果一行中没有组,它应该发出整个数字序列,所以如果它的 123456 我希望它发出 123456
  • 是的,我安装了 GNU sed,一切正常。

标签: bash macos unix sed


【解决方案1】:

之后我想用特定的字符串替换第一组。

GNU sed

sed -n -E 's/([0-9]+)\1/specificstring\1/p' file

要点

  • -n 抑制我们使用 s 命令的打印 (p) 标志覆盖的输出。
  • -E 启用扩展正则表达式。

注意 但是,这不会打印问题中未提及的没有相同组的行。

【讨论】:

  • @EdMorton 谢谢你,我在上面看到了你的评论。已经改变了。
  • 这会输出以下内容:echo 144144 | sed -n -E 's/([0-9]+)\1/specificstring\1/p' specificstring14444
  • @A.Hill 对不起,但我无法在我的 Linux 机器上重现它。它给了我正确的结果。
  • 是的,我在 Mac 上...不知道为什么它不同,或者我如何才能使它相同
【解决方案2】:

鉴于该文件仅包含 6 位数字而没有其他内容,因此可以这样做:

sed -n 's/\([0-9]\{3\}\)\1/\1/p' file

【讨论】:

  • 编辑:没有意识到格式化不起作用我更新了问题
  • @A.Hill 您使用的是哪个版本的sed
  • @A.Hill 我添加了一个 posix 版本
  • @A.Hill 您能否编辑您的问题以包含 hek2mgl 示例的预期输出
  • 好的,让我们试试我现在发布的简单命令。如果这不起作用,我会感到惊讶
【解决方案3】:

使用 BRE,并避免使用 +,因为它不是 POSIX RE 的一部分。

$ cat file
123123
23231
12323
123231
12345
144144
$ 
$ sed -n 's/^\([0-9]\{1,\}\)\1$/\1/p' file
123
144

【讨论】:

  • 据我所见,这实际上在 mac 上效果最好。我必须给你接受的答案才能让它在 OSX 上运行
  • @A.Hill 谢谢,但无论如何安装 GNU sed 并坚持使用它。
  • 是的,这是您需要做的才能使其与 MacOS/BSD sed 一起使用,因为当您在该 sed 中启用带有 -E 的 ERE 时,反向引用不起作用,但它们在运行时会起作用没有那个选项。安装 GNU sed 是正确的做法,您应该在安装 GNU awk 时安装它!
猜你喜欢
  • 2021-06-02
  • 2011-03-19
  • 2018-12-28
  • 1970-01-01
  • 1970-01-01
  • 2017-05-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多