Unixで改行を削除する


回答:


261

私はあなたの平均キャリッジ・リターン(仮定するつもりですCR"\r"0x0d)で終了する行のではなく、やみくもにファイル内を(あなたは私が知っているすべての文字列の途中でそれらを持っている場合があります)。このテストファイルを使用してCR、最初の行の終わりにのみa を付けます。

$ 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

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

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

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

$ 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

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


13
\rGNU sedのはだけで、他にあなたがこれを行うことができます動作します:sed `echo "s/\r//"`
のLaPO

15
MacOでは認識sedecho認識もしません\r。この場合、機能printf "\r"するように見えます。
スティーブパウエル

30
:スティーブさんのコメント@について詳しく説明するには、次のMacでは、以下の使用 sed "s/$(printf '\r')\$//"
mklement0

7
Macで問題を修正するには、単一引用符で囲まれたsed文字列に次の$ようにプレフィックスを付けることもできますsed $'s@\r@@g' |od -c (ただし、置換する\n場合はエスケープする必要があります)
nhed

1
私は100%確信はありませんが、OS Xの場合CTRL-V + CTRL-M\r外観の代わりに使用するとうまくいくようです。

240
tr -d '\r' < infile > outfile

tr(1)を参照


4
すばらしいわけではありません。1。インプレースで動作しません。2。EOL以外でも\ rを置き換えることができます(必要な場合とそうでない場合があります...)。
Tomasz Gandor 2014

10
1.ほとんどのunixyツールはそのように機能します。通常、それは問題を解決するための最も安全な方法です。2.述べられている質問は、改行を変換するのではなく、改行を削除することです。しかし、あなたにもっと役立つかもしれない他のたくさんの答えがあります。
Henrik Gustafsson 2014

1
エスケープをtrサポートしていない場合は\r'\015'またはリテラルを試してください'^M'(多くの端末の多くのシェルでは、ctrl-V ctrl-Mはリテラルctrl-M文字を生成します)。
tripleee 2014

それで、あなたが望むときにそれをどのように変更しますoutfile = infileか?
クリストファー

3
@donlan、遅い応答ですが、通常は次のようなものを使用しますsomeProg <in >out && mv out in
paxdiablo

38

古い学校:

tr -d '\r' < filewithcarriagereturns > filewithoutcarriagereturns

32

Linuxでの最も簡単な方法は、私の控えめな意見では、

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

強力な引用符の置換演算子の周りには's/\r//'ある不可欠。それらがないと、シェルは\rescape + rと解釈してそれをプレーンに減らしr、すべての小文字を削除しますr。そのため、2009年に上記でRobが提示した答えが機能しません。

そして、/g修飾子を追加することで\r、最初のものだけでなく、複数であっても確実に削除されます。



7

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

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


使用しようとしています-> sed 's / \ r \ n / = /' countryNew.txt>機能しないdemo.txt 「トラ」「ライオン」
Suvasis 2013

Macを使用しているという意味ですか?Darwin sedには、デフォルトではほとんどのLinuxバージョンとは異なるコマンドと機能セットがあるようです...
jsh

4
FYI、s/\r//OS X上の改行を削除していないようだ、文字通り取り除くように見えるr代わりに文字を。それがなぜなのかはまだわかりません。多分それは文字列が引用される方法と関係があるのでしょうか?回避策として、のCTRL-V + CTRL-M代わりに使用する\rと機能するようです。

6

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

:%s/\r//g

またはと

:1,$ s/^M//

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


2
良くない:ファイルのすべての行にCRがある場合(つまり、正しいDOSファイルである場合)、vimはfiletype = dosでロードし、^M-sをまったく表示しません。これを回避するには大量のキーストロークが必要ですが、これはvimの目的ではありません;)。sed -iEOLでの削除をCRに限定するために、「-e 's / \ r $ // g」を使用します。
Tomasz Gandor 2014

6

もう一度解決策...常にもう1つあるので:

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

これは適切な場所にあり、これまでに使用したあらゆる種類のunix / linuxで機能するので、すばらしいです。


3

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

インストールされている場合は、次の手順に進みます。まだインストールされていない場合は、次のようにインストールすることをお勧めしますyum

yum install dos2unix

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

dos2unix fileIWantToRemoveWindowsReturnsFrom.txt

2

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

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

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

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

...次回ログイン(またはsource ~/.bashrc現在のセッションで実行)するときdos2unixに、他の例と同じようにコマンドラインで名前を使用できます。


2

ここにあるのは

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

dos2unix fileName.extension fileName.extension


1

これを試して、DOSファイルをUNIXファイルに変換します。

fromdosファイル


1

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"

1

X環境を実行していて、適切なエディター(ビジュアルスタジオコード)を持っている場合は、推奨事項に従います。

Visual Studio Code:行末を表示する方法

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

Linux環境でNotepad ++の代わりにビジュアルコードを使用するだけで、準備が整います。


または、ファイルをLinuxシステムにコピーする前に、WindowsシステムでNotepad++のコマンドを使用Edit / EOL Conversion / Unix (LF)します。
ジェシーチザム

1

\rUNIX®システムでの削除:

この質問の既存のソリューションのほとんどはGNU固有であり、OS XまたはBSDでは機能しません。以下のソリューションは、さらに多くのUNIXシステムで動作し、シェルからシェルtcshまでsh、GNU / Linuxでも動作します。

OS X、OpenBSD、NetBSD tcsh、およびDebian GNU / Linuxでテスト済みbash


sed

ではtcshOS X上で、次sedのスニペットを一緒に使用することができprintfもないよう、sedでもechoハンドル\rGNUのような特別な方法ではありません。

sed `printf 's/\r$//g'` input > output

tr

別のオプションはtr

tr -d '\r' < input > output

違いsedtr

tr入力ファイルからの末尾の改行の欠如を保持しているように見えますが、sedOS XおよびNetBSD(ただしOpenBSDまたはGNU / Linuxではない)では、入力に欠落がある場合でも、ファイルの最後に末尾の改行が挿入されます。ファイルの末尾\rまたは\n最後。


テスト:

これがprintfand を使用してシステムで機能することを確認するために使用できるサンプルテストの一部hexdump -Cです。または、od -cシステムが見つからない場合にも使用できますhexdump

% printf 'a\r\nb\r\nc' | hexdump -C
00000000  61 0d 0a 62 0d 0a 63                              |a..b..c|
00000007
% printf 'a\r\nb\r\nc' | ( sed `printf 's/\r$//g'` /dev/stdin > /dev/stdout ) | hexdump -C
00000000  61 0a 62 0a 63 0a                                 |a.b.c.|
00000006
% printf 'a\r\nb\r\nc' | ( tr -d '\r' < /dev/stdin > /dev/stdout ) | hexdump -C
00000000  61 0a 62 0a 63                                    |a.b.c|
00000005
% 

0

私はそれのために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)

0

古い投稿ですが、最近同じ問題に遭遇しました。/ tmp / blah_dir /内にすべてのファイル名を変更する必要があったので、このディレクトリの各ファイルには「/ r」の末尾文字(ファイルの末尾に「?」が表示されている)があったため、スクリプトの方法でそれを行うことは私が考えることができただけでした。

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

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

最後に「awk」を試してみましたが、「\ r」を区切り文字として使用し、最初の部分を取りました

トリックは:

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

問題を修正するために使用したスクリプトスニペット(パス/ tmp / blah_dir /の末尾の文字としてすべてのファイルに「\ r」が含まれていた場合):

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

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


0

このシェルスクリプトを作成して、\ r文字を削除しました。ソラリスとレッドハットで動作します:

#!/bin/ksh

LOCALPATH=/Any_PATH

for File in `ls ${LOCALPATH}`
do
   ARCACT=${LOCALPATH}/${File}
   od -bc ${ARCACT}|sed -n 'p;n'|sed 's/015/012/g'|awk '{$1=""; print $0}'|sed 's/ /\\/g'|awk '{printf $0;}'>${ARCACT}.TMP
   printf "`cat ${ARCACT}.TMP`"|sed '/^$/d'>${ARCACT}
   rm ${ARCACT}.TMP
done

exit 0

-1

あなたは単にこれを行うことができます:

$ echo $(cat input) > output

なぜ誰かが「-1」を与えたのか分からない。これは完全に良い答えです(そして私のために働いた唯一の答えです)。
FractalSpace 2015年

1
ああ、すみません、私です。待って、見て、本当に '\ r'では機能しません!
Viacheslav Rodionov

1
@FractalSpaceこれはひどい考えです!ファイル内のすべてのスペースを完全に破壊し、ファイルのすべての内容をシェルによる解釈の対象にします。1行を含むファイルで試してくださいa * b...
Tom Fenech '28
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.