web-dev-qa-db-ja.com

^ I文字とは何ですか?sedでそれを見つけるにはどうすればよいですか?

私は通常、csvファイルからMySQLにデータをインポートしますが、データプロバイダーはNULLエントリを「」として残すため、「」を「\ N」に置き換える必要があります。これは、次のようなスクリプトで十分に簡単です。

for csvfile in *.csv
do
    sed -i -e 's/^,/\\N,/' -e 's/,$/,\\N/' -e 's/,,/,\\N,/g' -e 's/,,/,\\N,/g' $csvfile
done

ただし、カンマ付きのcsvファイルがあるため、インポートが失敗します。ファイルを「タブ区切り」として取得し、試してみました

for txtfile in *.txt
do
    sed -i -e 's/^\\t/\\N\\t/' -e 's/\\t$/\\t\\N/' -e 's/\\t\\t/\\t\\N\\t/g' -e 's/\\t\\t/\\t\\N\\t/g' $txtfile
done

しかし、それでも失敗します(私が知る限り、スクリプトは「\ N」を追加しません)。 Vimでタブ区切りファイルを開いて:set listと入力すると、タブが「^ I」として保存されているように見えます。 「\ t」を「\ ^ I」に置き換えようとしましたが、必要な「\ N」のNULL文字が追加されません。

何か案は?ありがとう!

5
Richard Herron

^ Isが何であるかについてはすでに答えがありますが、2番目のsedコマンドが失敗する理由の1つは、タブの照合に間違ったシーケンスを使用していることです。タブに一致するシーケンスは、\tではなく\\tです。 \\t\と一致し、その後にtが続きます。

2
garyjohn

^は通常Ctrlの省略形であり、Ctrl-IはTabと同じです

7
sgmoore