我的代码是这样的:
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)
括号是基本正则表达式 (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
(全局替换)修饰符在这里不会有任何影响,因为^
将表达式锚定到模式的开头(每行只能出现一次)