Sed 如何查找/修复具有混合行结尾(0x0d 0x0d 0x0a)的文件

Sed 如何查找/修复具有混合行结尾(0x0d 0x0d 0x0a)的文件,sed,find,grep,line-endings,Sed,Find,Grep,Line Endings,我知道我可以通过使用“flip-u”(cygwin-flip)来“可能”修复它们,它基本上删除了一个0xd,将文件保留为DOS样式的行结尾(0x0d 0x0a)(当然,从技术上讲,这可能被认为是一个bug!) 但另一方面,我希望有选择地这样做,确保我正在修复的是一个“非二进制”文件,并显式地用0x0d 0x0a替换0x0d 0x0a序列。。。没有运行一个错误的程序,似乎做我想要的(可能更多) 请注意,grep-p'\x0d\x0d\x0a'和grep-p'\x0d\x0d'找不到这些行 尽管有人

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

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

请注意,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
。例如,让我们创建一个testfile。我将使用实际文本与您将看到的行尾非常接近地表示:

$ 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
确实向我们展示了CRs和LFs(尽管LFs没有出现在同一行上——这是有道理的),所以现在我们可以找到它们:

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
您可以尝试bbe():

它将用unix行结尾替换行结尾;或:

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

这将用DOS行结尾取代它们。

谢谢,我曾抱有很高的希望,但。。。即使文件有0x0d 0x0d 0x0a行结尾,cat在行的末尾显示^M$,而不是^M^M$(Windows/cygwin)。基本上,0x0d 0x0d 0x0a混合似乎不适用于本主题中发布的大多数模式(sed、perl、grep等)-(嗯,非混合(DOS)文件cat-A的结果只是$…再次,现在我需要知道这是否如预期的那样,还是我在其他程序中看到的问题的另一个变体(例如,尽管\x0d\x0a可以通过egrep查找行,但由于某些原因\x0d\x0d找不到任何行,因此程序似乎将这些字符视为特例,而不是对文件中的所有字符进行文字搜索。正如我所说,在进行任何更改之前,我想知道我实际上是在匹配0x0d0x0d0a。我想是时候写我自己的程序!-p我误解了你基于平台的回答…$实际上是因为cat“-E”选项,这意味着显示行结尾…所以在DOS上,这意味着0x0d0x0a组合是$。M是“额外的”0x0d。这对于我来说是一种有用的方法,但grep模式只是“^M\$”。不幸的是,这不能很好地转化为问题的“查找文件”部分。例如,如何在查找类型上下文中使用cat+grep组合来列出树中具有错误行结尾的所有文件。
grep-IUPrl”\x0d\x0d$“
bbe -e 's/\x0d\x0d\x0a/\x0d\x0a/'