在sed中使用正则表达式查找和替换

时间:2013-03-08 06:14:19

标签: regex sed unix

我想替换

# Bulk Delete #

=== Bulk Delete ===

我正在使用以下sed命令。

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

它有效,但它也取代了

### Translation

======# Translation

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

2 个答案:

答案 0 :(得分: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.在我的示例中,我将其用作经典的便携式(对sed版本+的{​​{1}}的史前版本。{/ 1}。

另一种写作方式是:

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

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

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

答案 1 :(得分:1)

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

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

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