質問

Unixのファイルからすべてのキャリッジリターン\rを削除する最も簡単な方法は何ですか?

役に立ちましたか?

解決

ファイル内で盲目的にではなく、行の ends での復帰( CR "\r"0x0d)を意味すると仮定します(私が知っているすべてのために、文字列の途中でそれらを持っているかもしれません)。最初の行の最後にのみ CR を指定してこのテストファイルを使用します。

$ cat infile
hello
goodbye

$ cat infile | od -c
0000000   h   e   l   l   o  \r  \n   g   o   o   d   b   y   e  \n
0000017

dos2unixは、システムにインストールされている場合の方法です:

$ cat infile | dos2unix -U | od -c
0000000   h   e   l   l   o  \n   g   o   o   d   b   y   e  \n
0000016

何らかの理由でsedが利用できない場合、edがそれを行います:

$ cat infile | sed 's/\r$//' | od -c
0000000   h   e   l   l   o  \n   g   o   o   d   b   y   e  \n
0000016

何らかの理由で<=>が利用できない場合、<=>は複雑な方法でそれを行います:

$ echo ',s/\r\n/\n/
> w !cat
> Q' | ed infile 2>/dev/null | od -c
0000000   h   e   l   l   o  \n   g   o   o   d   b   y   e  \n
0000016

これらのツールのいずれかがボックスにインストールされていない場合、ファイルを変換しようとするよりも大きな問題があります:-)

他のヒント

tr -d '\r' < infile > outfile

tr(1)

を参照

古い学校:

tr -d '\r' < filewithcarriagereturns > filewithoutcarriagereturns

dos2unix というユーティリティがあり、多くのシステムに存在し、簡単にインストールできます。ほとんど。

Linuxで最も簡単な方法は、私の謙虚な意見では、

sed -i 's/\r$//g' <filename>

置換演算子's/\r//'を囲む強い引用符必須です。それらがなければ、シェルは\rをエスケープ+ rとして解釈し、それを単純なrに減らし、すべての小文字/gを削除します。そのため、2009年の Rob による上記の回答が機能しません。

そして<=>修飾子を追加すると、最初のものだけでなく、複数の<=>も削除されます。

sed -i s/\r// <filename>など。 man sedまたはsedの使用に関するWebで入手可能な豊富な情報を参照してください。

指摘すべきことの1つは、<!> quot; carriage return <!> quot;の正確な意味です。上記;本当に単一の制御文字<!> quot; carriage return <!> quot;を意味する場合、上のパターンは正しいです。より一般的にはCRLF(キャリッジリターンとラインフィード、つまりWindowsでのラインフィードの実装方法)を意味する場合は、代わりに\r\nを置き換えることができます。 Linux / Unixの裸の改行(改行)は\nです。

Viユーザーの場合、次のコマンドを使用してファイルを開き、キャリッジリターンを削除できます。

:%s/\r//g

または

:1,$ s/^M//

ctrl-v、次にctrl-mを押して^ Mと入力する必要があることに注意してください。

もう1つの解決策...もう1つは常にあるため:

perl -i -pe 's/\r//' filename

これは適切な場所にあり、私が作業したすべてのunix / linuxのフレーバーで動作するため、素晴らしいことです。

他の誰かがdos2unixをお勧めします。私も強くお勧めします。詳細を提供しています。

インストールされている場合、次のステップにジャンプします。まだインストールされていない場合、yumのようにインストールすることをお勧めします:

yum install dos2unix

その後、次のように使用できます:

dos2unix fileIWantToRemoveWindowsReturnsFrom.txt

これが物です

%0dは復帰文字です。 Unixとの互換性を持たせるため。以下のコマンドを使用する必要があります。

dos2unix fileName.extension fileName.extension

DOSファイルをUNIXファイルに変換するには、これを試してください:

  

fromdosファイル

dos2unixコマンドはないがPythonインタープリター(バージョン2.5以降)があるOS(OS Xなど)を使用している場合、このコマンドはsource ~/.bashrcコマンドと同等です:

python -c "import sys; import fileinput; sys.stdout.writelines(line.replace('\r', '\n') for line in fileinput.input(mode='rU'))"

これは、<=>と同様に、コマンドラインで名前付きファイルとパイプおよびリダイレクトの両方を処理します。この行を〜/ .bashrcファイル(または他のシェルの同等のプロファイルファイル)に追加する場合:

alias dos2unix="python -c \"import sys; import fileinput; sys.stdout.writelines(line.replace('\r', '\n') for line in fileinput.input(mode='rU'))\""

...次回ログインするとき(または現在のセッションで<=>を実行するとき)、他の例と同じ方法でコマンドラインで<=>名を使用できます。

UNIXの場合... dos2unixがUTF-8ファイルからUnicodeヘッダーを削除したことに気付きました。 git bash(Windows)では、次のスクリプトがうまく機能しているようです。 sedを使用します。行末の復帰のみを削除し、Unicodeヘッダーを保持することに注意してください。

#!/bin/bash

inOutFile="$1"
backupFile="${inOutFile}~"
mv --verbose "$inOutFile" "$backupFile"
sed -e 's/\015$//g' <"$backupFile" >"$inOutFile"

X環境を実行していて、適切なエディター(Visual Studioコード)を使用している場合、推奨事項に従います:

Visual Studioコード:行末を表示する方法

画面の右下隅に移動すると、Visual Studioコードにより、ファイルエンコーディングと行末規則の両方が表示され、その後にファイルが続きます。クリックするだけで切り替えられます。

Linux環境でnotepad ++の代わりにビジュアルコードを使用するだけで、準備完了です。

Pythonを使用しました。ここでは私のコードです。

end1='/home/.../file1.txt'
end2='/home/.../file2.txt'
with open(end1, "rb") as inf:
     with open(end2, "w") as fixed:
        for line in inf:
            line = line.replace("\n", "")
            line = line.replace("\r", "")
            fixed.write(line)

古い記事ですが、最近同じ問題に遭遇しました。このディレクトリの各ファイルには<!> quot; / r <!> quot;が含まれていたため、/ tmp / blah_dir /内で名前を変更するすべてのファイルがあったためです。末尾の文字(<!> quot;?<!> quot;をファイルの最後に表示)でしたので、それをスクリプトで実行することは私にしか想像できませんでした。

最終ファイルを同じ名前で(文字を末尾に付けずに)保存したかった。 sedの場合、問題は出力ファイル名でした。他の何かに言及するために必要でした(これは望ましくありませんでした)。

ここで提案されている他のオプションを試しました(いくつかの制限のためdos2unixとは見なされません)が、機能しませんでした。

<!> quot; awk <!> quot;で試しました。最終的には<!> quot; \ r <!> quotを使用した場所で機能しました。区切り文字として最初の部分を取得

トリックは:

echo ${filename}|awk -F"\r" '{print $1}'

以下のスクリプトスニペットを使用して(すべてのファイルに<!> quot; \ r <!> quot;パス/ tmp / blah_dir /の末尾の文字として)、問題を修正しました:

cd /tmp/blah_dir/
for i in `ls`
  do
    mv   $i     $(echo $i | awk -F"\r" '{print $1}')
done

注:この例は、私が働いたことに近いものの、あまり正確ではありません(ここで言及したのは、私がやったことについてより良いアイデアを与えるためです)

単純にこれを行うことができます:

$ echo $(cat input) > output
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top