我知道我可以通过使用“flip -u”(cygwin flip)“大概”修复它们,该方法基本上删除了0xd的其中一个带有DOS样式行结尾(0x0d 0x0a)的文件(当然,从技术上讲,这可能被认为是漏洞!)。
但另一方面是,我想选择性地执行此操作,以确保我要修复的实际上是一个“非二进制”文件,并用0x0d 0x0a明确替换0x0d 0x0d 0x0a序列...不运行a似乎可以执行我想要的(可能更多)的 buggy 程序。
请注意,grep -P'\x0d\x0d\x0a'和grep -P'\x0d\x0d'找不到这些行。
尽管人们说grep -P'x0d\x0a'可以正确地找到行尾,但我不得不猜测还有其他事情正在发生,因为它无法匹配带有混合行尾的文件中的其他模式(0x0d 0x0d 0x0a )。
最佳答案
这是一种识别包含混合行尾的文件的简单方法:
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
关于sed - 如何查找/修复具有MIXED行尾的文件(0x0d 0x0d 0x0a),我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/3773649/