\r
Unixでファイルからすべての復帰を削除する最も簡単な方法は何ですか?
\r
Unixでファイルからすべての復帰を削除する最も簡単な方法は何ですか?
回答:
私はあなたの平均キャリッジ・リターン(仮定するつもりです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
あなたが持っていない場合はすべてのあなたのボックスにインストールされているこれらのツールのを、あなたはファイルを変換しようとするよりも、大きな問題を持っている:-)
\r
GNU sedのはだけで、他にあなたがこれを行うことができます動作します:sed `echo "s/\r//"`
sed
もecho
認識もしません\r
。この場合、機能printf "\r"
するように見えます。
sed "s/$(printf '\r')\$//"
$
ようにプレフィックスを付けることもできますsed $'s@\r@@g' |od -c
(ただし、置換する\n
場合はエスケープする必要があります)
tr -d '\r' < infile > outfile
tr(1)を参照
tr
サポートしていない場合は\r
、'\015'
またはリテラルを試してください'^M'
(多くの端末の多くのシェルでは、ctrl-V ctrl-Mはリテラルctrl-M文字を生成します)。
outfile = infile
か?
someProg <in >out && mv out in
。
sed -i s/\r// <filename>
またはそのような; のman sed
使用に関するWebで入手可能な豊富な情報を参照してくださいsed
。
指摘すべきことの1つは、上記の「復帰」の正確な意味です。本当に単一の制御文字「キャリッジリターン」を意味する場合、上記のパターンは正しいです。より一般的には、CRLF(キャリッジリターンとラインフィード、つまりWindowsでのラインフィードの実装方法)を意味する場合は、\r\n
代わりに置き換える必要があります。Linux / Unixのベアラインフィード(改行)は\n
です。
Viユーザーの場合は、ファイルを開いて次のコマンドでキャリッジリターンを削除できます。
:%s/\r//g
またはと
:1,$ s/^M//
ctrl-vを押してからctrl-mを押して^ Mと入力する必要があることに注意してください。
^M
-sをまったく表示しません。これを回避するには大量のキーストロークが必要ですが、これはvimの目的ではありません;)。sed -i
EOLでの削除をCRに限定するために、「-e 's / \ r $ // g」を使用します。
他の誰かがお勧めしdos2unix
、私も強くお勧めします。詳細を提供しています。
インストールされている場合は、次の手順に進みます。まだインストールされていない場合は、次のようにインストールすることをお勧めしますyum
。
yum install dos2unix
その後、次のように使用できます。
dos2unix fileIWantToRemoveWindowsReturnsFrom.txt
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
に、他の例と同じようにコマンドラインで名前を使用できます。
ここにあるのは
%0d
復帰文字です。Unixと互換性を持たせるため。以下のコマンドを使用する必要があります。
dos2unix fileName.extension fileName.extension
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のコードは、ファイルエンコーディングと行末規則の両方を表示し、その後にファイルが続きます。クリックするだけで、それを切り替えることができます。
Linux環境でNotepad ++の代わりにビジュアルコードを使用するだけで、準備が整います。
Notepad++
のコマンドを使用Edit / EOL Conversion / Unix (LF)
します。
\r
UNIX®システムでの削除:この質問の既存のソリューションのほとんどはGNU固有であり、OS XまたはBSDでは機能しません。以下のソリューションは、さらに多くのUNIXシステムで動作し、シェルからシェルtcsh
までsh
、GNU / Linuxでも動作します。
OS X、OpenBSD、NetBSD tcsh
、およびDebian GNU / Linuxでテスト済みbash
。
sed
:ではtcsh
OS X上で、次sed
のスニペットを一緒に使用することができprintf
もないよう、sed
でもecho
ハンドル\r
GNUのような特別な方法ではありません。
sed `printf 's/\r$//g'` input > output
tr
:別のオプションはtr
:
tr -d '\r' < input > output
sed
とtr
:tr
入力ファイルからの末尾の改行の欠如を保持しているように見えますが、sed
OS XおよびNetBSD(ただしOpenBSDまたはGNU / Linuxではない)では、入力に欠落がある場合でも、ファイルの最後に末尾の改行が挿入されます。ファイルの末尾\r
または\n
最後。
これがprintf
and を使用してシステムで機能することを確認するために使用できるサンプルテストの一部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
%
古い投稿ですが、最近同じ問題に遭遇しました。/ 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
注:この例は、私が作業した内容に近いものの、あまり正確ではありません(ここで言及したことは、私が行ったことについてのより良いアイデアを与えるためです)
このシェルスクリプトを作成して、\ 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
あなたは単にこれを行うことができます:
$ echo $(cat input) > output
a * b
...