Sedで処理されたファイルはviとcatで異なるように見えます。

Sedで処理されたファイルはviとcatで異なるように見えます。

sed私はファイルを台無しにしたのか分からない。 orvilessよく表示されますが、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

(同じ制御文字を3つに異なって表現したものです。)

端末に直接送信されると、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

「私の目を信じることができません」という意見に関しては、制御シーケンスは物事がどのように現れるかを変えるので、混乱する可能性があります。状況をより明確に見る1つの方法は、catオプション-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

たとえば、

$ 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>

すべてのキャリッジリターンが削除されます。

関連情報