我想替换
# Bulk Delete #
带
=== Bulk Delete ===
我正在使用以下sed
命令。
sed "s/#\([^#]*\)#/===\1===/g" filename
它有效,但它也取代了
### Translation
与
======# Translation
如何防止它并使其在mac和ubuntu中都能正常工作?
答案 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