在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上达成一致。我不确定其他地方。根据它的帮助消息,GNUsed
(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上达成一致。我不确定其他地方。根据它的帮助消息,GNUsed
(4.4.2)使用-r
选项调用扩展正则表达式。但是,它似乎支持-E
作为-r
的未记录同义词。我在我的Linux机器上用GNU-sed版本4.2.1
尝试了它,它似乎对-E
感到满意。是的,-r
似乎是documente的选项我不确定我的系统上的手册页是否过时了。你能解释一下我的系统吗?谢谢你的解释你能解释一下吗#/==\1===/g'再多一点,或者给我指一些文档?我有点困惑。谢谢你的解释