Regex \+;在os x上的sed中未按预期工作
您似乎使用+来替换某个字符的“至少一个”字符串 然而,在OSX10.9.3上,我很难让它像预期的那样工作 我试图用一个n来替换一个或多个n的所有字符串——在许多编程语言中,它应该是:Regex \+;在os x上的sed中未按预期工作,regex,sed,Regex,Sed,您似乎使用+来替换某个字符的“至少一个”字符串 然而,在OSX10.9.3上,我很难让它像预期的那样工作 我试图用一个n来替换一个或多个n的所有字符串——在许多编程语言中,它应该是:n{1,} 但是,当我尝试使用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
n{1,}
但是,当我尝试使用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
您的sed可能不支持
\+
,在这种情况下,您可以简单地重复字符两次:
sed 's/nn*/2/g'
您的sed可能不支持
\+
,在这种情况下,您可以简单地重复字符两次:
sed 's/nn*/2/g'
默认情况下不支持“+”,您应该使用-E
标志来使用扩展表达式语法:
命令将如下所示:
sed-E的s/n+/2/g'
默认情况下不支持“+”,您应该使用-E
标志来使用扩展表达式语法:
命令将如下所示:
sed-E's/n+/2/g'
如果您为GNU-sed提供了-r
标志,那么它将提供支持
sed -r 's/n+/2/g'
如果您为GNU sed指定了-r
标志,则GNU sed支持
sed -r 's/n+/2/g'
tl;博士:
使用\{1,\}
而不是\+
使其在OSX上工作,更一般地说,编写可移植的基本正则表达式:
echo 'n nn nnn' | sed 's/n\{1,\}/2/g' # -> '2 2 2'
如果不考虑可移植性,请使用-E
启用对扩展正则表达式的支持,扩展正则表达式确实支持(未scaped)+
:
echo 'n nn nnn' | sed -E 's/n+/2/g' # -> '2 2 2'
复制符号
\+
不是的一部分,这是sed
使用的:
- 根据POSIX规范,仅此一项
- 默认情况下,在为扩展正则表达式提供可选支持的实现中(例如GNU
withsed
(以及-r
)和FreeBSD/OSX-E
withsed
)-E
sed
实现(例如GNUsed
)确实支持基本正则表达式中的\+
。其他(如FreeBSD/OSX
sed
)则不适用
因此,要编写真正可移植且符合POSIX的sed脚本,请执行以下操作:
echo 'n nn nnn' | sed 's/n\{1,\}/2/g' # -> '2 2 2'
- 不要使用扩展正则表达式
- 使用
代替\{1,\}
\+
sed
对\+
的支持所表明的那样,各种sed
实现支持POSIX标准的非标准扩展,即使在基本正则表达式中也是如此
因此,让一个特定的基本正则表达式sed
脚本在一个平台上工作并不能保证该脚本在所有POSIX平台上都能工作。
而且即使多个平台原则上支持给定的扩展,语法也可能不同。
举个例子:GNUsed
和FreeBSD/OSXsed
都支持基本正则表达式(以及扩展正则表达式)中的单词边界断言,但语法不同且相互排斥:
- GNU
:sed
或\
\b
- FreeBSD/OSX
:sed
[[[::]]
\{1,\}
而不是\+
使其在OSX上工作,更一般地说,编写可移植的基本正则表达式:
echo 'n nn nnn' | sed 's/n\{1,\}/2/g' # -> '2 2 2'
如果不考虑可移植性,请使用-E
启用对扩展正则表达式的支持,扩展正则表达式确实支持(未scaped)+
:
echo 'n nn nnn' | sed -E 's/n+/2/g' # -> '2 2 2'
复制符号
\+
不是的一部分,这是sed
使用的:
- 根据POSIX规范,仅此一项
- 默认情况下,在为扩展正则表达式提供可选支持的实现中(例如GNU
withsed
(以及-r
)和FreeBSD/OSX-E
withsed
)-E
sed
实现(例如GNUsed
)确实支持基本正则表达式中的\+
。其他(如FreeBSD/OSX
sed
)则不适用
因此,要编写真正可移植且符合POSIX的sed脚本,请执行以下操作:
echo 'n nn nnn' | sed 's/n\{1,\}/2/g' # -> '2 2 2'
- 不要使用扩展正则表达式
- 使用
代替\{1,\}
\+
sed
对\+
的支持所表明的那样,各种sed
实现支持POSIX标准的非标准扩展,即使在基本正则表达式中也是如此
因此,让一个特定的基本正则表达式sed
脚本在一个平台上工作并不能保证该脚本在所有POSIX平台上都能工作。
而且即使多个平台原则上支持给定的扩展,语法也可能不同。
举个例子:GNUsed
和FreeBSD/OSXsed
都支持基本正则表达式(以及扩展正则表达式)中的单词边界断言,但语法不同且相互排斥:
- GNU
:sed
或\
\b
- FreeBSD/OSX
:sed
[[[::]]
sed's/n\+/2/g'
这是应该转义的吗?你是说sed's/n+/2/g'
@John3136:sed
默认使用基本正则表达式,其中+
是一个普通字符;为了使它变得特别,必须对其进行转义(但这只在某些平台上有效,因为\+
不是基本正则表达式的POSIX标准的一部分,事实上,它在OSX上不起作用,这是问题的症结所在。)sed's/n\+/2/g'
应该转义吗?你是说sed's/n+/2/g'
@John3136:sed
默认使用基本正则表达式,其中+
是一个普通字符;为了使其特殊化,必须对其进行转义(但这仅适用于某些平台,因为\+
不是基本正则表达式的POSIX标准的一部分,事实上,它不适用于OSX,w