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

Pet*_*r Y 6 grep sed line-endings find

我知道我可以通过使用"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 ).

Kal*_*son 5

这是识别包含混合行尾的文件的简单方法:

cat -A $FILE | grep '\^M\^M\$'
Run Code Online (Sandbox Code Playgroud)

-A暗示-v-E包括行结尾和其他隐藏字符。例如,让我们创建一个测试文件。我将使用实际文本来与您将看到的行尾非常接近:

$ od -x test1.txt 
0000000 6464 2061 0d20 0a0d 6464 6161 2020 0d0d
0000020 0a0a 6164 2020 0a0d
0000030
Run Code Online (Sandbox Code Playgroud)

现在让我们看看 cat 给了我们什么:

$ cat -vE test1.txt
dda  ^M^M$
ddaa  ^M^M$
$
da  ^M$
Run Code Online (Sandbox Code Playgroud)

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
Run Code Online (Sandbox Code Playgroud)