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

shi*_*eta 3 sed xterm vi

我不知道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
Run Code Online (Sandbox Code Playgroud)

申请sed

sed -i 's/scaffold/scaffold\_/' [myfile]
Run Code Online (Sandbox Code Playgroud)

我也试过这个没有反斜杠的相同结果。

使用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
Run Code Online (Sandbox Code Playgroud)

那个“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    
Run Code Online (Sandbox Code Playgroud)

不要将^M字符有一些与此有关?就像我不能相信自己的眼睛在这里......

Jim*_*ris 7

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

^M     1
Run Code Online (Sandbox Code Playgroud)

两次。那是,

<carriage-return><tab>1
^M^I1
\r\t1
Run Code Online (Sandbox Code Playgroud)

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

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

当您查看cat原始文件时,此附加文件会1显示在现有1.文件的顶部,因此您没有注意到它。

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

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

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

sed -i 's/\r\t1//g' myfile
Run Code Online (Sandbox Code Playgroud)

关于您的“我不敢相信自己的眼睛”评论——因为控制序列会改变事物的显示方式,是的,它们可能会令人困惑。更清楚地查看事物的一种方法是使用cat's-v-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
Run Code Online (Sandbox Code Playgroud)

例如:

$ cat myfile
scaffold1test
$ cat -t myfile
scaffold_hello^M^I1
Run Code Online (Sandbox Code Playgroud)