如何在 VI 模式下删除 ^M 特殊字符 - 无法使用 dos2unix 删除,无法通过 cat 或 grep 打印整行

How to remove ^M special character in VI mode - Can't remove using dos2unix, can't print the whole line doing cat or grep

Linux:RHEL5 提坎加 版本:2.6.18-402.el5(根据 uname -a)

我正在创建一个文件,方法是从 windows 源文件(其中包含一些 Version=x.x.x 值)中提取一些行并将其放入新文件 aa.txt。这适用于查找和 grepping 部分。

做类似 echo -n "AA "; echo "$(grep "Version=[1-9]" /some/mounted/loc/windows/sourcefile.txt) -" >> aa.txt 的事情。

因此,生成的 aa.txt 文件看起来像这样: 现在,如果我 cat 它,它不会打印第一行,只打印最后一个 - 字符。

如果我使用 dos2unix(实际上仅用于删除行结束字符并将 Windows 格式文件转换为 Linux 行结束字符格式文件),它仍然不起作用,因为第一行中的 ^M 不是该行中的最后一个字符。 PS:如果您注意到,第一个 ^M 的颜色与第二行的颜色不同,这是我通过键入手动添加的。

运行 od -cab aa.txt(八进制转储)在这个文件上,告诉我:

  1. 对于第一个^M,字符是\rcr sp015 040(即回车return和一个不可见的space字符)。

  2. 第二行 ^M 向我显示正常值 ^ M^ M136 115(因为我手动输入 ^M 在第二行,这是预期的)。

问题:
1. 使用 tr -d '\r' < aa.txt > new.aa.txt 我可以解决这个问题,但是我可以在 vivim 中使用什么模式来在命令模式下删除这个字符。 尝试了 :%s/^M//g,但没有捕捉到模式。

您可能使用了一个真正的插入符号后跟一个 M?那里的字符实际上是一个 Ctrl-M,你可以用 Ctrl-V 然后再按 Ctrl-M。

类型

:%s/\r/\r/g

这是说:

:%s在整个文件中查找和替换(替换)(%)
\r 找到马车 returns
\r 并替换为换行符(或者在第二个 \r 中将其替换为空行)
g 在同一行多次

我知道这听起来很愚蠢,但在查找部分,vim 在 \r 下包含回车符 returns 并且在替换部分 vim 使用换行符。

替代方案 如果上述方法不起作用,可能对您有用:

  • 完全按照您看到的方式键入以下键(在正常模式下)
    :%s/Ctrl +vCtrl+m//g输入
  • :e ++ff=dos+ :set ff=unix

如果您在 Windows 机器上工作,以下可能有效:

  • :%s/Ctrl+qCtrl+m //g输入