sed - 当我无法写“^M”时替换“^M”

sed - 当我无法写“^M”时替换“^M”

我正在使用 cygwin 连接到 RAM 有限(512M)的小型虚拟机。

另外,我正在尝试从 4GB csv 文件导入到 sqlite3 数据库,但除了 2 行(总共 8.717.201 行)之外,我没有任何导入线索

似乎我在 2 行上有一个 control-m 字符(^M),因此它破坏了 csv 格式并且无法导入。

当我尝试使用sed 's|,^M|,|' file.csvcontrol-m char 时,会写入文本 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 所写,您通常可以^MctrlV后面加上ctrlM.

该命令的意思是

  • /^M$/{...}:在行尾有分页符的行上执行大括号中的命令
  • Next 将下一行追加到缓冲区,并在行之间嵌入换行符
  • s/^M\n// s将回车符+换行符替换为空(删除换行符)

这个简单的脚本假设一行最多被破坏一次。否则你需要类似的东西

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

答案2

在 sed 或 vi 上获取代表新行(或 Enter)以进行替换的方法之一^M是键入:

ctrlV enter

相关内容