私のファイルの多くにはDOS行末があることがわかりました。VIでは、「^M」のようになります。これらのDOS行末がないファイルを変更したくありません。bashスクリプトを使用してこれを行うにはどうすればよいですか?ありがとう!
EV
grep -URl ^M . | xargs fromdos
grepは、現在のディレクトリの下にあるDOS行末のすべてのファイルのリストを取得します。
-U
grepに、デフォルトで行末を削除するのではなく、行末を考慮させる
-R
再帰的にします
-l
一致する行ではなく、ファイル名のみをリストします
次に、そのリストをコンバーターコマンド(私が出身fromdos
のubuntuにあります)にパイプします。dos2unix
注:実際には入力しないでください^M
。代わりに、<Ctrl-V>
次にを押し<Ctrl-M>
て文字を挿入し、^M
grepに目的を理解させる必要があります。または、$'\r'
代わりに入力することもできます^M
(ただし、bashでのみ機能する可能性があると思います...)。
使用する1つの方法GNU coreutils
:
< file.txt tr -d '\r'
ubuntuでは、fromdos
ユーティリティを使用します
fromdos test.txt
上記の例では、MS-DOSまたはMicrosoft Windowsファイル、または行区切り文字が異なるその他のファイルを取得し、LinuxおよびUnixで読み取るために新しい行区切り記号でファイルをフォーマットします。
多くのオプションがあります..これらのいずれかで試すことができます..http://www.theunixschool.com/2011/03/different-ways-to-delete-m-character-in.html
cat origin_file.txt | sed "s/^M//" > dest_file.txt
その文字を取得するには、上記と同じことを実行する必要があります。ctl-V、次にctl-Mです。これは、多くのプラットフォーム間で移植可能であり、bash内でシンプルに保つことができるため、私にとっては好ましいことです。
ubuntuで私もこの作品を見つけます:
cat origin_file.txt | sed "s / \ r //"> dest_file.txt
次のコマンドを使用できます。
dos2ux file.in>file.out or:
perlで:
perl -pi -e 's/\r//g' your_file
または、次のことを行うことができます。
:%s/[ctrl-V][CTRL-M]//g
マルチバイトファイルを変換する場合は、特別な注意が必要であり、おそらく正しいiconvを使用するか、エンコード仕様から再コード化する必要があることに注意してください。
プレーンASCIIファイルの場合、以下の両方の方法が機能します。
このflip
プログラムは、Debianではパッケージとも呼ばれflip
、行末を処理できます。マニュアルから:
When asked to convert a file to the same format that it already
has, flip causes no change to the file. Thus to convert all
files to **IX format you can type
flip -u *
and all files will end up right, regardless of whether they were
in MS-DOS or in **IX format to begin with. This also works in the
opposite direction.
または、GNUrecodeを使用することもできます。
< /etc/passwd recode ..pc | tee a b > /dev/null
file a b
出力:
a: ASCII text, with CRLF line terminators
b: ASCII text, with CRLF line terminators
UNIXの行末に変換します。
recode pc.. a b
file a b
出力:
a: ASCII text
b: ASCII text
recodeはpc
、dosの行末をとして省略します。したがって、ロジックpc..
は次のようになります。pc形式からデフォルトのlatin1に変換し、UNIXの行末を指定します。
ファイルの末尾でフィルタリングする必要がある場合の勝者の回答の変更
grep -URl ^M . | grep .php | xargs dos2unix
fromdosの代わりにdos2unixを使用しましたが、効果は同じであるはずです。