sed - "^M"を書き込めない場合は、"^M"を置き換えます。

sed - "^M"を書き込めない場合は、"^M"を置き換えます。

私はcygwinを使ってRAM(512M)が限られたコンパクトな仮想マシンに接続しています。

また、4 GBのcsvファイルからsqlite3データベースにインポートしようとしていますが、2行(合計8.717.201行)を除いてインポートに関する手がかりはありません。

行2にcontrol-m文字(^ M)があるようで、csv形式が壊れてインポ​​ートに失敗します。

control-m charを使用しようとすると、sed 's|,^M|,|' file.csvテキストASCII(2文字)が作成されるため、代替項目は検索されません。

これを行うためにテストファイルを使用し、検索と置換のために開くと、コードで書かれていますvi(青い^ Mと単一文字として機能します)。

CSVファイルを修復する方法? (またはcygwinでcontrol-mシーケンスをどのように書き換えますか?

問題のある行の例:

$ cat -e test
keyword3,keyword1,keyword4$
keyword1,keyword2,keyword3^M$
,keyword4$
keyword5,keyword1,keyword2$

どうすればいいですか:

$ cat -e test
keyword3,keyword1,keyword4$
keyword1,keyword2,keyword3,keyword4$
keyword5,keyword1,keyword2$

PS:ご覧のとおり、英語は私の母国語ではありませんでした。

答え1

実際、キャリッジリターンは間違った改行を識別するのに役立ちます。

s '/^M$/{N;s/^M\n//;}' test

Steeldriverが書いたように^M一般的ctrlVctrlM

コマンドの意味

  • /^M$/{...}:行末に改ページがある行で中括弧で囲まれたコマンドを実行します。
  • Next はバッファに次の行を追加し、行間に改行文字を挿入します。
  • s/^M\n// sキャリッジリターン+改行文字を何もないものに置き換え(改行文字削除)

この単純なスクリプトは、行が最大1回中断されると仮定します。それ以外の場合は、次のものが必要です。

sed 'H;1h;$!d;x;s/^M\n//g' file

答え2

置換のためにsedまたはviから改行(またはEnter)表現を取得する1つの方法^Mは、次のように入力することです。

ctrlV enter

関連情報