某些行我有一个包含大量的SQL语句,如一个文件:选择性搜索和替换使用正则表达式
CREATE TABLE "USER" (
"ID" INTEGER PRIMARY KEY,
"NAME" CHARACTER VARYING(50) NOT NULL,
"AGE" INTEGER NOT NULL
);
COPY "USER" (id, name, age) FROM stdin;
1 Skywalker 19
2 Kenobi 57
我想在COPY
报表的列名应大写并引用:
COPY "USER" ("ID", "NAME", "AGE") FROM stdin;
使用SED,我发现下面的正则表达式:
sed -r 's/([(])(\w+)([,)])/\1"\U\2\E"\3/g'
它确实取代列名,但它是没有选择性不够,在文件中替换换句话说:
~/test]$sed -r 's/([(])(\w+)([,)])/\1"\U\2\E"\3/g' star_wars_example
CREATE TABLE "USER" (
"ID" INTEGER PRIMARY "KEY",
"NAME" CHARACTER VARYING("50")NOT "NULL",
"AGE" INTEGER NOT NULL
);
COPY "USER" ("ID", "NAME", "AGE") FROM stdin;
1 Skywalker 19
2 Kenobi 57
为了避免这个问题,我想的sed只适用于我的正则表达式来开始与线COPY
并以FROM stdin;
结尾。
我已经看过前瞻/ lookbehead,但它们不支持在sed中。它们似乎在超级sed中得到了支持,但我目前使用Cygwin(Windows在此处是强制性的......),并且它在包列表中似乎不可用。
有没有办法强制sed只考虑特定行?
我已经考虑申请管道之前我的文件通过的grep sed的,但随后其他线路将从输出消失。
我失去了一些东西明显?
如果答案很容易适用于默认的Cygwin安装,那将会很棒。我想我可以尝试在cygwin上安装super-sed,但我想知道是否有更明显的想法
给出你的例子,用\ [a-z] +替换\ w +可以工作,但它可能对任何东西都不够有选择性。 – 2010-05-27 11:22:56
你对这两种情况都是对的!我给出了一个简化的例子,但是我真正的担心是不小心替换了COPY语句读取的一些数据,因为那里有很多数据... – 2010-05-27 11:40:42