Regex \1未在RE中定义
在我的脚本中,我正在传递一个标记文件并使用sed,我试图找到没有一个或多个#且不是空行的行,然后用Regex \1未在RE中定义,regex,bash,sed,Regex,Bash,Sed,在我的脚本中,我正在传递一个标记文件并使用sed,我试图找到没有一个或多个#且不是空行的行,然后用标记将这些行包围起来 我的推理: ^[^#]+在行首,查找不以1或更多开头的行# \+然后查找包含一个或多个字符的行(也称为非空行) 然后将匹配行替换为\1,其中\1表示匹配行 但是,我得到“\1未在RE中定义”。我上面的推理正确吗?我如何纠正这个错误 BODY=$(sed -E 's/^[^#]+.\+/<p>\1</p>/g' "$1") BODY=$(sed-E's/
标记将这些行包围起来
我的推理:
^[^#]+
在行首,查找不以1或更多开头的行#
\+
然后查找包含一个或多个字符的行(也称为非空行)
然后将匹配行替换为\1
,其中\1
表示匹配行
但是,我得到“\1未在RE中定义”。我上面的推理正确吗?我如何纠正这个错误
BODY=$(sed -E 's/^[^#]+.\+/<p>\1</p>/g' "$1")
BODY=$(sed-E's/^[^#]+.\+/\1/g''s$1)
后跟数字的反斜杠将替换为regexp中第n个捕获组的匹配项,但您的regexp没有捕获组
如果要替换整个匹配项,请使用&
:
BODY=$(sed -E 's%^[^#].*%<p>&</p>%' "$1")
BODY=$(sed-E的%^[^#].%&%'“$1”)
您不需要使用+
来查找非空行,因为它的开头有一个字符与#
不匹配,这意味着它不是空的。而且在[^#]
之后不需要+
——只需要第一个字符不是
。当regexp匹配整行时,您也不需要使用g
修饰符——这只需要替换每行的多个匹配项
由于替换字符串包含/
,因此需要对其进行转义或将分隔符更改为其他字符。\1
指括号内的第一个匹配项,例如()
。你没有这样的表达式。如果你想替换整个匹配项,请使用&
好的,我试过了,但是我在替换命令中得到了错误标志:'>
nvm解决了,我将除虫器改为BODY=$(sed-E's%^[^#].%&%g''1”)
你不需要g
修饰符,因为每行只能匹配一次。分隔符问题与您最初提到的问题不同。