2016-07-11 107 views
0

我有數百個文件包含像下面。在我的sqlldr'文本限定符和我的文件被拒絕,因爲文本如Wegman's,其中包含文本本身的撇號。查找替換字符串不匹配特定模式

使用sed/awk有沒有辦法找到這樣的字符串並用'tick或者什麼替換'?

t2.txt';'20160707071500';'478251533';'TWN';'20160620160801';'1';'691891-2';'2';'0';'Employer';'1';'OMCProcessed';'Wegman's Food Market';'';'Wegman's Food Markets';'14411364807' 

我認爲的一個解決方案是找到不等於';'的文本。但不知道如何投入使用。

回答

2

也許這裏sed是一個更好的選擇

$ sed -r 's/([^;])(\x27)([^;])/\1\2\2\3/g' file 

't2.txt';'20160707071500';'478251533';'TWN';'20160620160801';'1';'6918912';'2';'0';'Employer';'1';'OMCProcessed';'Wegman''s Food Market';'';'Wegman''s Food Markets';'14411364807' 
+0

尼斯。可能更易讀:'sed -r「s /([^;])'([^;])/ \ 1''\ 2 /」file '。 – SLePort

+0

@Kenavoz你的解決方案要簡單得多,但是我們不需要添加'/ g'來代替全局嗎? 'sed -r「s /([^;])'([^;])/ \ 1 \ 2/g」t1'這就是我的作品。 – user2570205

+0

@Kenavoz,更正確的可讀性,我試圖避免雙引號腳本出於某種原因,使用char代碼避免了腳本的單引用連接舞蹈。 – karakfa

1

在SQL中通常逃避單引號的方法是將它們加倍,但是您可以修改gsub的調用以將其替換爲任何您喜歡的。

可能有更好的方法來做到這一點,但在這裏我只是從每個字段中刪除封閉引號,替換內部引號,然後再次將引號分配回原始字段。

$ cat m.txt 
't2.txt';'20160707071500';'478251533';'TWN';'20160620160801';'1';'691891-2';'2';'0';'Employer';'1';'OMCProcessed';'Wegman's Food Market';'';'Wegman's Food Markets';'14411364807' 

$ cat m.awk 
BEGIN { FS=OFS=";" } 
{ 
    for (i=1; i<=NF; ++i) { 
     f = substr($i,2,(length($i) - 2)) 
     gsub("'", "''", f) 
     $i = "'" f "'"; 
    } 
}1 

$ awk -f m.awk m.txt 
't2.txt';'20160707071500';'478251533';'TWN';'20160620160801';'1';'691891-2';'2';'0';'Employer';'1';'OMCProcessed';'Wegman''s Food Market';'';'Wegman''s Food Markets';'14411364807' 
相關問題