7

我知道我可以“可能”通过使用“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 )。

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 给了我们什么:

$ 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 回答