dos换行符文件中的换行符?

dos换行符文件中的换行符?

我的 dos 文件默认使用 CRLF 作为换行符。但是,有时我会得到 LF 而不是 CRLF。我需要弄清楚换行符到底发生在哪里。而且我不想用 CRLF 替换 LF。只是为了用换行符查看记录的更改

答案1

给出以下简短示例:

$ cat -et file
122323432.....^M$
4354363645....^M$
45234564655...$
34r52435346...^M$
122323432.....^M$

(其中cat -et用于显示行结尾)然后

$ awk '{last = $0} NR==1 {cr = /^M$/ ? 0 : 1; next} cr == 0 && /^M$/ {print last; cr = 1} cr == 1 && !/^M$/ {print last; cr = 0}' file | cat -et
4354363645....^M$
45234564655...$
34r52435346...^M$

例如,使用+^M作为实际 CR 字符输入。CtrlV Enter


这是一个有点字面翻译的尝试python

#!/usr/bin/python3

import re

p = re.compile(r'.*\r$')

with open('file', 'r', newline='') as f:
    for idx, line in enumerate(f):
        last = line
        m = p.match(line)
        if (idx==0):
            cr = 0 if m else 1
        if (cr==0) and m:
            print(last, end='')
            cr = 1
        elif (cr==1) and not m:
            print(last, end='')
            cr = 0

答案2

如果你的系统有cat这个-e开关,你可以用它来查看回车符。此处,第一行有 CR(显示为^M),第二行没有。

$ cat -e crlf
foo^M$
bar$

(尽管如果某个小丑M在您的文件中写了一个字面脱字符号 + 组合,那么它看起来与 CR 一样。)

或者,使用less -U-r如果未给出),它显示回车符,与 类似^M,但颜色相反。

答案3

使用 GNU grep:

grep --binary -v $'\r'$ dosfile

输入示例(第 3 行有一个小丑持有插入符号和 M):

$ cat -e dosfile
line1^M$
line2^M$
line3 joker ^M^M$
line4^M$
line5^M$
line6$
line7$

$ od -c dosfile
0000000   l   i   n   e   1  \r  \n   l   i   n   e   2  \r  \n   l   i
0000020   n   e   3       j   o   k   e   r       ^   M  \r  \n   l   i
0000040   n   e   4  \r  \n   l   i   n   e   5  \r  \n   l   i   n   e
0000060   6  \n   l   i   n   e   7  \n
0000070

$ grep --binary -v $'\r'$ dosfile
line6
line7

相关内容