Linuxで[〜#〜] crlf [〜#〜]をファイル内の改行に変換する最良の方法は何ですか?
sed コマンドを見たことがありますが、もっと簡単なものはありますか?
次のコマンドを使用します。
fromdos yourtextfile
逆に:
todos yourtextfile
これらのコマンドはtofrodosパッケージ(最新のディストリビューション)にあり、2つのラッパーunix2dosおよびdos2unix同じ名前の古いUNIXツールを模倣しています。
dos2unix
。
dos2unix-DOS/MACからUNIXへのテキストファイル形式コンバーター
dos2unix [options] [-c convmode] [-o file ...] [-n infile outfile ...] Options: [-hkqV] [--help] [--keepdate] [--quiet] [--version]
私はPerlを好む:
Perl -lne 's/\r//g; print' winfile.txt > unixfile.txt
しかし、それは私の用途に非常に適しており、覚えるのはとても簡単です。すべてのシステムにdos2unixコマンドがあるわけではありませんが、私が取り組んでいるほとんどのシステムにはPerlインタープリターがあります。
もう1つはrecodeであり、dos2unixおよびiconvの強力な代替品です。 Debianリポジトリの「recode」パッケージで利用できます:
recode ibmpc..lat1 winfile.txt # dos2unix
recode lat1..ibmpc unixfile.txt # unix2dos
awkファンの場合:
awk '{ sub("\r$", ""); print }' winfile.txt > unixfile.txt
...およびsed:
sed 's/\r$//' winfile.txt > unixfile.txt
そして今、 stackoverflow.comの友達の1人 から直接、16進エディターで手動でCRを削除するよりも少し複雑ですbeefインタープリター(フレンドリーな近所のDebianリポジトリにあります)、
dos2unix inbrainfuck!
,[[->+>+<<]>>>,[<-------------[+++++++++++++.>>>]<[>>----------[>+++++++++++++.-------------]<++++++++++>]<<<<[-]>>>[-<<<+>>>]]<[-]<[-]<]++++++++++.
これを書くために彼の人生の1時間を無駄にしてくれたjkに感謝します!
私はこれを Bash で行います:
cat cr_stuffed.file | tr -d \r > no_more_crs.file
tr
も使用できると思います(試してみる面白いフォーマットファイルはありません)。
tr -d '\r' < file1 > file2
私は非常に簡単な方法を見つけました…nanoでファイルを開く:## nano file.txt
ctrl + Oを押して保存しますが、Enterを押す前に、Alt + Dを押してDOSとUnix/Linuxの行末を切り替えるか、Alt + Mを押してMacとUnix/Linuxの行末を切り替えてから、Enterを押して保存します。 Ctrl + Xで終了します。
In viまたは Vim :
:%s/^V^M//g
私は Vim と:set fileformat=unix
を好みます。最速ではありませんが、プレビューが表示されます。末尾が混在しているファイルの場合に特に便利です。
これをdos2unix.py Pythonスクリプトに貼り付けます。
#!/usr/bin/env python
"""\
convert dos linefeeds (crlf) to unix (lf)
usage: dos2unix.py <input> <output>
"""
import sys
if len(sys.argv[1:]) != 2:
sys.exit(__doc__)
content = ''
outsize = 0
with open(sys.argv[1], 'rb') as infile:
content = infile.read()
with open(sys.argv[2], 'wb') as output:
for line in content.splitlines():
outsize += len(line) + 1
output.write(line + '\n')
print("Done. Saved %s bytes." % (len(content)-outsize))
Pythonがインストールされているすべてのプラットフォームで動作するはずです。パブリックドメイン。
CR LF
からLF
へawkを使用:
awk -v RS='\r?\n' 1
command | awk -v RS='\r?\n' 1
awk -v RS='\r?\n' 1 filename
使用例:
echo -e 'foo\nbar\r\nbaz' | awk -v RS='\r?\n' 1 | hexdump -C
説明:
-v RS='\r?\n'
は、変数RS(inputr ecord s eparator)を\r?\n
に設定し、入力が読み取られることを意味しますLF(\n
)で区切られた行ごとの行(?
)の前にCR(\r
)を付けることができます。
1
は、awkが実行するスクリプトです。スクリプトはcondition { action }
で構成されます。この場合、1
はtrueと評価される条件です。アクションが省略されているため、デフォルトのアクションが実行されます。つまり、現在の行を出力します(これは、{print $0}
または単に{print}
としても記述できます)。
LF
to CR LF
:変数ORS
を設定できます(outputr ecord s eparator)出力の行末を変更します。例:
echo -e 'foo\nbar\r\nbaz' | awk -v RS='\r?\n' -v ORS='\r\n' 1 | hexdump -C
GUIメソッドが必要な場合は、 Kate テキストエディターを試してください(他の高度なテキストエディターでもこれを処理できる場合があります)。 find/Replaceダイアログを開きます(Ctrl+R)、\r\n
を\n
に置き換えます。 (注:ドロップダウンから[正規表現]を選択し、オプションから[選択のみ]を選択解除する必要があります。)
編集:または、単にUnix形式に変換する場合は、メニューオプションTools
> End of Line
> Unix
を使用します。
正規表現でPerlの一般的な\R
を使用します。そうすれば、CR、CRLF、またはすでにLFまたはそれらの組み合わせでファイルを変換できます(そう、2つの異なる改行規則が混在するファイルがあります!)。
Perl -i.bak -pe 's/\R/\n/g' $yourfile
(-i.bak
は、ファイルを元の場所に変換し、元のファイルを${yourfile}.bak
として保存するようにPerlに指示します)
\R
の詳細 この答え
WindowsシステムからUNIXシステムにファイルを緊急転送するために必要なファイルにこのスクリプトを使用しました。
find . -type f | xargs file | grep CRLF | cut -d: -f1 | xargs dos2unix
find . -type f
コマンドを実行しているディレクトリで再帰的にすべてのファイルを検索します
xargs file
file プログラムに渡して、ファイルの分析を取得します。
grep CRLF
CRLFを示す file の出力のみが必要です。
cut -d: -f1
色までの出力を取得します。残りを破棄します。今はファイル名だけが必要です
xargs dos2unix