我的 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