2010-05-27 68 views
3

某些行我有一個包含大量的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,但我想知道是否有更明顯的想法

+1

給出你的例子,用\ [a-z] +替換\ w +可以工作,但它可能對任何東西都不夠有選擇性。 – 2010-05-27 11:22:56

+0

你對這兩種情況都是對的!我給出了一個簡化的例子,但是我真正的擔心是不小心替換了COPY語句讀取的一些數據,因爲那裏有很多數據... – 2010-05-27 11:40:42

回答

2

由於目前我沒有sed可用,並且從未實際使用過分組,命令可能會或可能無法正常工作(在所有,或按預期)=)

嘗試

sed -r '/^COPY /{ s/([(])(\w+)([,)])/\1"\U\2\E"\3/g }' 

如果我正確理解說明書,這將執行上開始COPY任何線的取代。

另一種方法是使用分支。這看起來會複雜得多,但更靈活。

+0

哇,非常感謝!這工作完美無瑕。雖然這解決了我遇到的問題,但我對分支方法感到好奇:是否涉及對文件進行格式化,尋找「^ COPY」,然後將結果「分支」到sed或標準輸出?如何做到這一點? (也許在另一個答案中發佈,以便人們也可以投票) – 2010-05-27 12:50:30

+1

@eneveu:你在這裏。我編輯了這個到我原來的答案。但是,未經測試。 sed似乎是徹底完成的。害怕。 – Jens 2010-05-27 12:56:54

+0

@Jens:我從第二個例子中得到一個錯誤:「sed:-e表達式#1,字符9:未知命令:'C'」 – 2010-05-28 02:23:47