Sed 处理的文件在 vi 和 cat 中显示不同

Sed 处理的文件在 vi 和 cat 中显示不同

我不知道是否sed弄乱了我的文件。在viless中显示正常,但catmore插入其他字符。为什么他们的表现不同

我使用的是带有标准 xterm 的 redhat linux 系统。

之前的原始选项卡文件:

scaffold1000    693:14709284:741:333    129011535   1
scaffold1000    693:14709284:27:726 129011535   1
scaffold1000    693:14709284:44:1157    129011535   1
scaffold1000    693:14709284:771:459    129011535   1
scaffold1000    693:14709284:610:615    129011535   1
scaffold1000    693:14709284:1152:1159  129011535   1

申请sed

sed -i 's/scaffold/scaffold\_/' [myfile]

我也尝试过不使用反斜杠来得到相同的结果。

使用cat我看到这个:

scaffold11000   693:14709284:741:333    129011535   1
scaffold11000   693:14709284:27:726 129011535   1
scaffold11000   693:14709284:44:1157    129011535   1
scaffold11000   693:14709284:771:459    129011535   1
scaffold11000   693:14709284:610:615    129011535   1

这个“1”从哪里来? :(

编辑vi或使用less我看到:

scaffold_1000   693:14709284:741:333    129011535       1^M     1^M     1       
scaffold_1000   693:14709284:27:726     129011535       1^M     1^M     1       
scaffold_1000   693:14709284:44:1157    129011535       1^M     1^M     1       
scaffold_1000   693:14709284:771:459    129011535       1^M     1^M     1       
scaffold_1000   693:14709284:610:615    129011535       1^M     1^M     1       
scaffold_1000   693:14709284:1152:1159  129011535       1^M     1^M     1    

^M字符与此有关吗?就像我无法相信自己的眼睛一样......

答案1

文件的每一行都包含字符串

^M     1

两次。那是,

<carriage-return><tab>1
^M^I1
\r\t1

(这些是相同控制字符的三种不同表示)

当它直接发送到您的终端时,cat终端会将其解释为移回行首、移动 8 个字符并显示1.

当您查看cat原始文件时,此附加文件1显示在现有文件之上1,因此您没有注意到它。

将前缀从 更改为 后scaffoldscaffold_附加内容1现在显示在 上_,所以现在您注意到了。

vi当您在或中打开文件时emacs,编辑器不会以<carriage-return>相同的方式解释序列,而是显示它。

我假设您不想要<carriage-return><tab>1文件中的字符串。您可以使用以下命令删除它们sed

sed -i 's/\r\t1//g' myfile

关于你的“我不能相信自己的眼睛”评论——因为控制序列改变了事物的显示方式,是的,它们可能会令人困惑。更清楚地查看事物的一种方法是使用cat-voptions -T

-v, --show-nonprinting   use ^ and M- notation, except for LFD and TAB
-T, --show-tabs          display TAB characters as ^I
-t                       equivalent to -vT

例如:

$ cat myfile
scaffold1test
$ cat -t myfile
scaffold_hello^M^I1

答案2

^M是一个回车符。

您可以使用dos2unix <file>它从文件中删除 DOS 密钥

答案3

如果你没有dos2unix,你可以这样做sed

sed -i 's/\r//g' <THE FILE NAME>

它将删除所有回车符。

相关内容