sed 分组取消了结果?

sed 分组取消了结果?

在 Windows 下运行以下sed命令时(将不属于其他单词的关键字大写):

"c:\Program Files (x86)\GnuWin32\bin\sed.exe" -e "s/[^a-z]*declare[^a-z]*/DECLARE/I" "SqlFile.sql"

将从declare @returntable变成。SqlFile.SqlDECLAREreturntable

但是添加捕获组来将周围的字符传输到目标字符串,将保留declare小写:

"c:\Program Files (x86)\GnuWin32\bin\sed.exe" -e "s/([^a-z]*)declare([^a-z]*)/\\1DECLARE\\2/I" "SqlFile.sql"

为什么 sed 对分组集合应用的规则与对非分组集合应用的规则不同?

(我知道\b单词边界是将关键字大写的更好方法,但我观察到了这种sed行为,并想知道原因是什么)

答案1

这是因为"(foo)"不是 的捕获组sed,仅仅"\(foo\)"是。

Sed 通常会错误地使用\1和而\2没有定义任何捕获组,但是事实并非如此,因为"\\1"显然它不会\1像在 中那样在您的 shell(command.exe?)中扩展到bash

因此,您尝试用带有文字反斜杠的字符串替换带有文字括号的字符串,但它不匹配,因此保持declare小写。

相关内容