如何使用MIXED行结尾查找/修复文件(0x0d 0x0d 0x0a)

时间:2010-09-22 21:07:33

标签: sed find grep line-endings

我知道我可以通过使用“flip -u”(cygwin flip)来“修复”它们,它基本上删除了其中一个0xd,留下了带有DOS样式行结尾的文件(0x0d 0x0a)(当然,从技术上讲,这可能是被认为是一个错误!)。

但另一方面是我想有选择地做这个,确保我正在修复的是“非二进制”文件并且明确地用0x0d 0x0a替换0x0d 0x0d 0x0a序列...没有运行似乎做我想要的(甚至可能更多)的错误程序。

请注意,grep -P'\ x0d \ x0d \ x0a'和grep -P'\ x0d \ x0d'找不到这些行。

虽然人们说grep -P'x0d \ x0a'正确找到行结尾,但我不得不推测其他东西正在发生,因为它与混合行结尾的文件中的其他模式不匹配( 0x0d 0x0d 0x0a)。

2 个答案:

答案 0 :(得分:3)

这是一种识别包含混合行结尾的文件的简便方法:

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

答案 1 :(得分:0)

您可以尝试bbe(http://bbe-.sourceforge.net/):

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

将替换以unix行结尾结尾的行;或者:

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

将用DOS行结尾替换它们。