sed
私はファイルを台無しにしたのか分からない。 orvi
は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
(同じ制御文字を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>
すべてのキャリッジリターンが削除されます。