我不知道是否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
申请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
,因此您没有注意到它。
将前缀从 更改为 后scaffold
,scaffold_
附加内容1
现在显示在 上_
,所以现在您注意到了。
vi
当您在或中打开文件时emacs
,编辑器不会以<carriage-return>
相同的方式解释序列,而是显示它。
我假设您不想要<carriage-return><tab>1
文件中的字符串。您可以使用以下命令删除它们sed
:
sed -i 's/\r\t1//g' myfile
关于你的“我不能相信自己的眼睛”评论——因为控制序列改变了事物的显示方式,是的,它们可能会令人困惑。更清楚地查看事物的一种方法是使用cat
和-v
options -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>
它将删除所有回车符。