\ 1未在RE中定义

时间:2017-03-21 00:42:09

标签: regex bash sed

在我的脚本中,我正在传递一个markdown文件并使用sed,我正在尝试查找没有一个或多个#的行而不是空行,然后用<p></p>包围这些行标签

我的推理:

^[^#]+在行的开头,找到不以1或更多#

开头的行

.\+然后找到包含一个或多个字符的行(也就是非空行)

然后将匹配的行替换为<p>\1</p>,其中\1表示匹配的行。

然而,我得到“\ 1未在RE中定义”。我的推理是否正确,如何解决此错误?

BODY=$(sed -E 's/^[^#]+.\+/<p>\1</p>/g' "$1")

1 个答案:

答案 0 :(得分:3)

反斜杠后跟一个数字将替换为正则表达式中第N个捕获组的匹配,但您的正则表达式没有捕获组。

如果您想要替换整场比赛,请使用&

BODY=$(sed -E 's%^[^#].*%<p>&</p>%' "$1")

您不需要使用.+来查找非空行 - 事实上,它在开头有一个与#不匹配的字符意味着&# 39;不是空的。在+之后你不需要[^#] - 所有你关心的是第一个角色不是#。当正则表达式与整行相匹配时,您也不需要g修饰符 - 只需要每行替换多个匹配项。

由于您的替换字符串包含/,因此您需要将其转义或将分隔符更改为其他字符。