2016-07-11 8 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' 

私が考えていた解決策の1つは、 'と等しくないテキストを見つけることです。どのように使用するように配置するか分からない。

答えて

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 /"ファイル 'のように読みやすいかもしれません。 – SLePort

+0

@Kenavozあなたのソリューションははるかに簡単ですが、グローバルを置き換えるために '/ g'を追加する必要はありませんか? 'sed -r" s /([^;]) '([^;])/ \ 1 \ 2/g "t1'これは私の作品です。 – user2570205

+0

@Kenavoz、より読みやすく修正しました。何らかの理由で二重引用符を避けようとしています。文字コードを使用すると、スクリプトの一重引用符の連結ダンスを避けることができます。 – 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' 
関連する問題