我不知道sed是不是把我的文件搞砸了。在vi或less它显示正确,但cat并more插入其他字符。为什么它们的显示方式不同
我在带有标准 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字符有一些与此有关?就像我不能相信自己的眼睛在这里......
文件的每一行都包含字符串
^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)