在sed中使用regex查找和替换

在sed中使用regex查找和替换,regex,sed,unix,Regex,Sed,Unix,我想换一个 # Bulk Delete # 与 我正在使用以下sed命令 sed "s/#\([^#]*\)#/===\1===/g" filename 它起作用了,但它也取代了 ### Translation 与 如何防止它并使它在mac和ubuntu中都能工作?最简单的方法是匹配空格: sed 's/# \([^#]*\) #/=== \1 ===/g' filename 另一种方法是在两个哈希之间要求多个(一个或多个)非哈希: sed 's/#\([^#]\{1,\}\)#/===

我想换一个

# Bulk Delete #

我正在使用以下
sed
命令

sed "s/#\([^#]*\)#/===\1===/g" filename
它起作用了,但它也取代了

### Translation


如何防止它并使它在mac和ubuntu中都能工作?

最简单的方法是匹配空格:

sed 's/# \([^#]*\) #/=== \1 ===/g' filename
另一种方法是在两个哈希之间要求多个(一个或多个)非哈希:

sed 's/#\([^#]\{1,\}\)#/===\1===/g' filename
\{n,m\}
是一种量词符号,它要求模式在其前面至少出现n次,最多出现m次,因此它是
*
+
元字符(可以用
{0,1}
{0,\}
{1,}表示)的泛化
分别)。如果m缺失,则表示不小于n的任何数字;如果缺少n,则表示不大于m的任何数字,因此等于0。在我的示例中,我使用它作为
+
的经典、可移植(到Linux和Mac OS X以外的
sed
的史前版本)版本

另一种写作方式是:

sed 's/#\([^#][^#]*\)#/===\1===/g' filename
当然,你可以把这些想法结合起来:

sed 's/# \([^#][^#]*\) #/=== \1 ===/g' filename
sed 's/# \([^#]\{1,\}\) #/=== \1 ===/g' filename

最简单的方法是匹配空格:

sed 's/# \([^#]*\) #/=== \1 ===/g' filename
另一种方法是在两个哈希之间要求多个(一个或多个)非哈希:

sed 's/#\([^#]\{1,\}\)#/===\1===/g' filename
\{n,m\}
是一种量词符号,它要求模式在其前面至少出现n次,最多出现m次,因此它是
*
+
元字符(可以用
{0,1}
{0,\}
{1,}表示)的泛化
分别)。如果m缺失,则表示不小于n的任何数字;如果缺少n,则表示不大于m的任何数字,因此等于0。在我的示例中,我使用它作为
+
的经典、可移植(到Linux和Mac OS X以外的
sed
的史前版本)版本

另一种写作方式是:

sed 's/#\([^#][^#]*\)#/===\1===/g' filename
当然,你可以把这些想法结合起来:

sed 's/# \([^#][^#]*\) #/=== \1 ===/g' filename
sed 's/# \([^#]\{1,\}\) #/=== \1 ===/g' filename

您可以使用
+
强制至少一个非
#

由于OSX中的
sed
默认情况下不支持像
+
这样的增强正则表达式语法,因此需要将
-E
标志传递给sed。好消息是
-E
标志在
*nix
系统上也能很好地工作。使用
-E
标志时,可以跳过特殊正则表达式字符的转义,如
+
)等

sed -E "s/#([^#]+)#/===\1===/g" filename

您可以使用
+
强制至少一个非
#

由于OSX中的
sed
默认情况下不支持像
+
这样的增强正则表达式语法,因此需要将
-E
标志传递给sed。好消息是
-E
标志在
*nix
系统上也能很好地工作。使用
-E
标志时,可以跳过特殊正则表达式字符的转义比如
+
)等等

sed -E "s/#([^#]+)#/===\1===/g" filename

@JonathanLeffler-更新了答案。尝试使用
-E-E
标志,应该可以在
OSX
*nix
上使用
-E
选项(表示所有版本的
sed
)指定下一个参数是脚本的一部分;您可以多次指定它以构建复杂脚本。在Mac OS X上,您可以使用
-E
选项调用“扩展正则表达式”,但不需要反斜杠:
sed-E-E's/#([^#]+#/==\1==/g'
。是的,你是对的,
-e
是可选的。应该提到这一点。好的,我们在Mac上达成一致。我不确定其他地方。根据它的帮助消息,GNU
sed
(4.4.2)使用
-r
选项调用扩展正则表达式。但是,它似乎支持
-E
作为
-r
的未记录同义词。我在我的Linux机器上用
GNU-sed版本4.2.1
尝试了它,它似乎对
-E
感到满意。是的,
-r
似乎是documente的选项我不确定我的系统上的手册页是否过时。@JonathanLeffler-更新了答案。尝试使用
-E-E
标志,应该可以同时使用
OSX
*nix
选项
-E
(意思是所有版本的
sed
)指定下一个参数是脚本的一部分;您可以多次指定它以构建复杂脚本。在Mac OS X上,您可以使用
-E
选项调用“扩展正则表达式”,但不需要反斜杠:
sed-E-E's/#([^#]+#/==\1==/g'
。是的,你是对的,
-e
是可选的。应该提到这一点。好的,我们在Mac上达成一致。我不确定其他地方。根据它的帮助消息,GNU
sed
(4.4.2)使用
-r
选项调用扩展正则表达式。但是,它似乎支持
-E
作为
-r
的未记录同义词。我在我的Linux机器上用
GNU-sed版本4.2.1
尝试了它,它似乎对
-E
感到满意。是的,
-r
似乎是documente的选项我不确定我的系统上的手册页是否过时了。你能解释一下我的系统吗?谢谢你的解释你能解释一下吗#/==\1===/g'再多一点,或者给我指一些文档?我有点困惑。谢谢你的解释