如何在 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
的事情。
- 我必须将
echo -n
分别用于 AA
即我不能将 echo AA
与 echo version part
与后一个 echo 命令组合在一起。
因此,生成的 aa.txt
文件看起来像这样:
现在,如果我 cat
它,它不会打印第一行,只打印最后一个 -
字符。
如果我使用 dos2unix
(实际上仅用于删除行结束字符并将 Windows 格式文件转换为 Linux 行结束字符格式文件),它仍然不起作用,因为第一行中的 ^M
不是该行中的最后一个字符。 PS:如果您注意到,第一个 ^M
的颜色与第二行的颜色不同,这是我通过键入手动添加的。
运行 od -cab aa.txt
(八进制转储)在这个文件上,告诉我:
对于第一个^M
,字符是\r
、cr sp
和015 040
(即回车return和一个不可见的space字符)。
第二行 ^M
向我显示正常值 ^ M
、^ M
和 136 115
(因为我手动输入 ^
和 M
在第二行,这是预期的)。
问题:
1. 使用 tr -d '\r' < aa.txt > new.aa.txt
我可以解决这个问题,但是我可以在 vi
或 vim
中使用什么模式来在命令模式下删除这个字符。
尝试了 :%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输入
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
的事情。
- 我必须将
echo -n
分别用于AA
即我不能将echo AA
与echo version part
与后一个 echo 命令组合在一起。
因此,生成的 aa.txt
文件看起来像这样:
cat
它,它不会打印第一行,只打印最后一个 -
字符。
如果我使用 dos2unix
(实际上仅用于删除行结束字符并将 Windows 格式文件转换为 Linux 行结束字符格式文件),它仍然不起作用,因为第一行中的 ^M
不是该行中的最后一个字符。 PS:如果您注意到,第一个 ^M
的颜色与第二行的颜色不同,这是我通过键入手动添加的。
运行 od -cab aa.txt
(八进制转储)在这个文件上,告诉我:
对于第一个
^M
,字符是\r
、cr sp
和015 040
(即回车return和一个不可见的space字符)。第二行
^M
向我显示正常值^ M
、^ M
和136 115
(因为我手动输入^
和M
在第二行,这是预期的)。
问题:
1. 使用 tr -d '\r' < aa.txt > new.aa.txt
我可以解决这个问题,但是我可以在 vi
或 vim
中使用什么模式来在命令模式下删除这个字符。
尝试了 :%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输入