在 Windows 下运行以下sed
命令时(将不属于其他单词的关键字大写):
"c:\Program Files (x86)\GnuWin32\bin\sed.exe" -e "s/[^a-z]*declare[^a-z]*/DECLARE/I" "SqlFile.sql"
将从declare @returntable
变成。SqlFile.Sql
DECLAREreturntable
但是添加捕获组来将周围的字符传输到目标字符串,将保留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
小写。