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

时间:2014-06-11 00:53:21

标签: regex sed

您似乎使用+来替换某个字符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 

4 个答案:

答案 0 :(得分:4)

TL; DR:

使用 \{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 expressionsed使用的是

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

一些 -E实现(例如,GNU sed 支持基本正则表达式中的sed
其他(例如,FreeBSD / OSX \+

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

  • 请勿使用扩展正则表达式
  • 使用sed代替\{1,\}

<强>买者

由于GNU \+sed的支持演示,各种\+实现支持POSIX标准的非标准扩展即使在基本正则表达式

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

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

一个例子:GNU sed和FreeBSD / OSX sed都支持基本正则表达式中的字边界断言(以及扩展的那些),但语法不同且互斥

  • GNU sedsed / \<\>
  • FreeBSD / OSX \bsed / [[:<:]]

答案 1 :(得分:3)

&#34; +&#34;默认情况下不支持,您应该使用-E标志来使用扩展表达式语法:

命令看起来像: sed -E 's/n+/2/g'

答案 2 :(得分:2)

你的sed可能不支持\+,在这种情况下你可以简单地重复两次角色:

sed 's/nn*/2/g'

答案 3 :(得分:1)

如果你给它-r标志,那么GNU sed支持extended regular expressions

sed -r 's/n+/2/g'