我想换
# 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。在我的示例中,我将其用作经典的、可移植的(适用于sed
Linux 和 Mac OS X 的史前版本)版本的+
.
另一种写法是:
sed 's/#\([^#][^#]*\)#/===\1===/g' filename
当然,您可以结合这些想法:
sed 's/# \([^#][^#]*\) #/=== \1 ===/g' filename
sed 's/# \([^#]\{1,\}\) #/=== \1 ===/g' filename
您可以使用+
来强制执行至少一个不是#
由于sed
在 OSX 中默认情况下不支持增强的正则表达式语法+
,因此您需要将-E
标志传递给 sed。好消息是-E
flag 在*nix
系统上也能很好地工作。使用-E
标志时,您可以跳过转义特殊的正则表达式字符,如+
,(
等。
sed -E "s/#([^#]+)#/===\1===/g" filename