您似乎使用+来替换某个字符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
答案 0 :(得分:4)
使用 \{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
使用的是
sed
{{1} }(以及-r
)和FreeBSD / OSX -E
与sed
)。 一些 -E
实现(例如,GNU sed
) 支持基本正则表达式中的sed
。
其他(例如,FreeBSD / OSX \+
)不。
因此,要编写真正可移植且符合POSIX标准的sed
脚本:
sed
代替\{1,\}
<强>买者强>
由于GNU \+
对sed
的支持演示,各种\+
实现支持POSIX标准的非标准扩展即使在基本正则表达式。
因此,让特定的基本 -regex sed
脚本在一个平台上运行并不能保证脚本可以在所有POSIX平台上运行。
即使多个平台原则上支持给定扩展名 ,语法也可能不同。
一个例子:GNU sed
和FreeBSD / OSX sed
都支持基本正则表达式中的字边界断言(以及扩展的那些),但语法不同且互斥:
sed
:sed
/ \<
或\>
\b
:sed
/ [[:<:]]
答案 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'