\1 未在 RE 中定义?

Lau*_*ra 3 sed

我的代码是这样的:

cat file.ign | sed 's/^([^A-Za-z0-9]+ )/<ignore>\1<\/ignore>/g'
Run Code Online (Sandbox Code Playgroud)

但是我收到一条错误消息:

sed: 1: "s/^([^A-Za-z0-9]+ )/<ig ...": \1 not defined in the RE
Run Code Online (Sandbox Code Playgroud)

ste*_*ver 6

括号是基本正则表达式 (BRE) 语法中的字面意思 - 为了使它们表示捕获组,它们必须被转义,如\(\)

此外,正如@BenjaminW 在评论中所指出的,+在 BRE 中也是文字。GNU sed 支持\+作为 BRE 中的量词:

sed 's/^\([^A-Za-z0-9]\+ \)/<ignore>\1<\/ignore>/g'
Run Code Online (Sandbox Code Playgroud)

(但其他实现可能不会)。或者,根据需要使用-E-r命令行开关打开扩展正则表达式 (ERE) 模式(检查您的版本的文档):

sed -E 's/^([^A-Za-z0-9]+ )/<ignore>\1<\/ignore>/g'
Run Code Online (Sandbox Code Playgroud)

或使用符合 POSIX 的量词 \{1,\}

sed 's/^\([^A-Za-z0-9]\{1,\} \)/<ignore>\1<\/ignore>/g'
Run Code Online (Sandbox Code Playgroud)

除了g(全局替换)修饰符在这里不会有任何影响,因为^将表达式锚定到模式的开头(每行只能出现一次)