Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Regex \+;在os x上的sed中未按预期工作_Regex_Sed - Fatal编程技术网

Regex \+;在os x上的sed中未按预期工作

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

您似乎使用+来替换某个字符的“至少一个”字符串

然而,在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 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
    sed
    with
    -r
    (以及
    -E
    )和FreeBSD/OSX
    sed
    with
    -E
一些
sed
实现(例如GNU
sed
)确实支持基本正则表达式中的
\+

其他(如FreeBSD/OSX
sed
)则不适用

因此,要编写真正可移植且符合POSIX的sed脚本,请执行以下操作:

echo 'n nn nnn' | sed 's/n\{1,\}/2/g' # -> '2 2 2'
  • 不要使用扩展正则表达式
  • 使用
    \{1,\}
    代替
    \+
警告

正如GNU
sed
\+
的支持所表明的那样,各种
sed
实现支持POSIX标准的非标准扩展,即使在基本正则表达式中也是如此

因此,让一个特定的基本正则表达式
sed
脚本在一个平台上工作并不能保证该脚本在所有POSIX平台上都能工作。

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

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

  • GNU
    sed
    \
    \b
  • FreeBSD/OSX
    sed
    [[[::]]
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
    sed
    with
    -r
    (以及
    -E
    )和FreeBSD/OSX
    sed
    with
    -E
一些
sed
实现(例如GNU
sed
)确实支持基本正则表达式中的
\+

其他(如FreeBSD/OSX
sed
)则不适用

因此,要编写真正可移植且符合POSIX的sed脚本,请执行以下操作:

echo 'n nn nnn' | sed 's/n\{1,\}/2/g' # -> '2 2 2'
  • 不要使用扩展正则表达式
  • 使用
    \{1,\}
    代替
    \+
警告

正如GNU
sed
\+
的支持所表明的那样,各种
sed
实现支持POSIX标准的非标准扩展,即使在基本正则表达式中也是如此

因此,让一个特定的基本正则表达式
sed
脚本在一个平台上工作并不能保证该脚本在所有POSIX平台上都能工作。

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

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

  • 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