[英]Find and replace using regex in sed
我要更换
# Bulk Delete #
同
=== Bulk Delete ===
我正在使用以下sed
命令。
sed "s/#\([^#]*\)#/===\1===/g" filename
它有效,但也可以替代
### Translation
同
======# 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
您可以使用+
强制执行至少一个非#
字符
由于OSX中的sed
默认不支持增强的正则表达式语法,例如+
,因此您需要将-E
标志传递给sed。 好消息是-E
标志也可以在*nix
系统上很好地工作。 使用-E
标志时,可以跳过转义特殊的正则表达式字符,例如+
, (
等。
sed -E "s/#([^#]+)#/===\1===/g" filename
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.