2

我想换

# Bulk Delete #

=== Bulk Delete ===

我正在使用以下sed命令。

sed "s/#\([^#]*\)#/===\1===/g" filename

它有效,但它也取代了

### Translation

======# Translation

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

4

2 回答 2

3

最简单的方法是也匹配空白:

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

另一种方法是在两个散列之间要求多个(一个或多个)非散列:

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

是一个量词符号,\{n,m\}它需要至少n次出现和最多m次出现在它之前的模式,所以它是?,*+元字符(可以分别表示为\{0,1\},\{0,\}\{1,\})的泛化。如果缺少m,则表示不小于n的任何数字;如果n缺失,则表示任何不大于m的数字,因此等于 0。在我的示例中,我将其用作经典的、可移植的(适用于sedLinux 和 Mac OS X 的史前版本)版本的+.

另一种写法是:

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

当然,您可以结合这些想法:

sed 's/# \([^#][^#]*\) #/=== \1 ===/g' filename
sed 's/# \([^#]\{1,\}\) #/=== \1 ===/g' filename
于 2013-03-08T06:17:15.930 回答
1

您可以使用+来强制执行至少一个不是#

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

sed -E "s/#([^#]+)#/===\1===/g" filename
于 2013-03-08T06:20:19.543 回答