7

基本的に 0xd の 1 つを削除し、DOS スタイルの行末 (0x0d 0x0a) でファイルを残す「flip -u」(cygwin フリップ) を使用して、「おそらく」それらを修正できることを私は知っています (もちろん、技術的に言えば、これはバグ!)。

しかし、それの反対側は、これを選択的に行いたいということです。私が修正しているのは本当に「非バイナリ」ファイルであり、明示的に 0x0d 0x0d 0x0a シーケンスを 0x0d 0x0a に置き換えます...私がやりたいこと(そしておそらくそれ以上)をしているように見えるバグのあるプログラム。

grep -P '\x0d\x0d\x0a' および grep -P '\x0d\x0d' ではこれらの行が見つからないことに注意してください。

人々は grep -P 'x0d\x0a' が行末を適切に見つけていると言いますが、行末が混在しているファイル内の他のパタ​​ーンと一致しないため、何か他のことが起こっていると推測する必要があります (0x0d 0x0d 0x0a )。

4

2 に答える 2

5

混合行末を含むファイルを識別する簡単な方法を次に示します。

cat -A $FILE | grep '\^M\^M\$'

は行末やその他の隠し文字を意味-A-vます。-Eたとえば、テストファイルを作成しましょう。実際のテキストを使用して、表示される行末とかなり密接に表現します。

$ od -x test1.txt 
0000000 6464 2061 0d20 0a0d 6464 6161 2020 0d0d
0000020 0a0a 6164 2020 0a0d
0000030

それでは、猫が私たちに与えるものを見てみましょう:

$ cat -vE test1.txt
dda  ^M^M$
ddaa  ^M^M$
$
da  ^M$

cat確かに、CR と LF が表示されます (ただし、LF は同じ行に表示されませんが、当然のことですが)、これらを見つけることができます。

find /path -yourPredicatesOfInterest -print | while read fn ; do
    cat -A $fn | grep '\^M\^M\$' > /dev/null 2>&1 && echo "$fn contains multiple CR CR LFs"
done
于 2010-09-22T21:42:49.923 に答える
0

bbe を試すことができます ( http://bbe-.sourceforge.net/ ):

bbe -e 's/\x0d\x0d\x0a/\x0a/'

これにより、行末が UNIX の行末に置き換えられます。また:

bbe -e 's/\x0d\x0d\x0a/\x0d\x0a/'

これにより、DOS 行末に置き換えられます。

于 2010-09-23T19:49:42.957 に答える