某些行我有一個包含大量的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