gpt4 book ai didi

regex -\+ 在 os x 上的 sed 中没有按预期工作

转载 作者:行者123 更新时间:2023-12-05 08:43:48 26 4
gpt4 key购买 nike

似乎您使用 + 来替换某个字符的“至少一个”字符串 https://unix.stackexchange.com/questions/19014/how-to-strip-multipe-spaces-to-one-using-sed

但是我无法让它在 OS X 10.9.3 上按预期工作。

我正在尝试替换一个或多个 n 的所有字符串——在许多编程语言中它会是:n{1,}——用单个 n。

但是当我尝试使用 sed 执行此操作时,它不起作用

$ echo 'nnnn nnnn 234 nnnnnn nnnnnn nnnnnnnn nnnn 2340 492 nnnn nnnn 324 nnnnn 302' | sed 's/n/2/g'
2222 2222 234 222222 222222 22222222 2222 2340 492 2222 2222 324 22222 302

$ echo 'nnnn nnnn 234 nnnnnn nnnnnn nnnnnnnn nnnn 2340 492 nnnn nnnn 324 nnnnn 302' | sed 's/n+/2/g' ## this is what I want to do but it is not working


$ echo 'nnnn nnnn 234 nnnnnn nnnnnn nnnnnnnn nnnn 2340 492 nnnn nnnn 324 nnnnn 302' | sed 's/n*/n/g' ##replaces the empty string, which I don't want
n n n2n3n4n n n n n n2n3n4n0n n4n9n2n n n n3n2n4n n n3n0n2n

最佳答案

tl;博士:

使用 \{1,\} 而不是 \+让它在 OSX 上工作,更一般地说,编写可移植的基本正则表达式:

echo 'n nn nnn' | sed 's/n\{1,\}/2/g' # -> '2 2 2'

如果便携性不是问题,请使用 -E启用对扩展 正则表达式的支持,它支持(未转义)+ :

echo 'n nn nnn' | sed -E 's/n+/2/g'  # -> '2 2 2'

重复符号 \+不是 the POSIX definition of a basic regular expression 的一部分,这就是sed用途:

  • 独家,根据 POSIX 规范。
  • 默认情况下,在为扩展正则表达式提供可选支持的实现中(例如 GNU sed-r(以及-E ) 和 FreeBSD/OSX sed-E )。

一些 sed实现(例如,GNU sed)确实支持\+尽管如此,在基本的正则表达式中。
其他(例如,FreeBSD/OSX sed)

因此,编写真正可移植且符合 POSIX 的 sed脚本:

  • 不要使用扩展正则表达式
  • 使用\{1,\}而不是 \+

警告

作为 GNU sed\+ 的支持演示,各种sed实现支持对 POSIX 标准的非标准扩展,即使在基本正则表达式中也是如此。

因此,获取特定的基本-regex sed在一个平台上运行的脚本并不能保证脚本在所有 POSIX 平台上运行。

并且即使多个平台原则上支持给定的扩展,语法也可能不同

恰当的例子:GNU sed和 FreeBSD/OSX sed支持基本正则表达式(以及扩展正则表达式)中的词边界断言,但语法不同且相互排斥:

  • GNU sed : \</\>\b
  • FreeBSD/OSX sed : [[:<:]]/[[:>:]]

关于regex -\+ 在 os x 上的 sed 中没有按预期工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24153096/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com