【发布时间】:2026-02-02 21:00:01
【问题描述】:
在 Windows 10 环境中,我必须检查目录中有多少 CSV 文件(分隔符为“;”)具有这种奇怪的换行符模式:CR CR LF(或 \r\r\n,如果您愿意)。
但是,我既不能用 grep 也不能用 awk 匹配 \r\r。在 awk 上,我还尝试将 RS 更改为 ; 和 FS 一个未使用的字符(#),但显然 awk 匹配单个 CR,而不是 CR CR。因此,Windows 中的 awk 将 CR CR LF 视为 CR LF 和 FNR 输出的记录数等于任何其他“正常结束行”文件。
奇怪的是,使用 Notepad++ 我可以清楚地看到 CR CR LF(导致额外的换行符,例如在 Excel 中),并且使用内置的正则表达式查找器,搜索 \r\r\n 匹配所有行。是否可以强制 awk 在不删除某些 CR 的情况下对原始文本文件执行操作?
该文件是这样的(我已经简化了一点):5 行,4 个 x 字段,由 ; 分隔,每行末尾有一个 CRCRLF。用 Notepad++(和 Excel)打开我看到 10 行。
我希望下面的 GNU awk 脚本会返回 16 5
BEGIN {RS = ";";FS = "#"; linecount = 0}
/\r\r/ {linecount = linecount + 1}
END {print FNR, linecount}
但是,它返回16 0。如果我搜索以匹配 /\r/,则会获得 16 5。
所以基本上我担心 Windows CMD shell 在将流传递给 gawk 之前会剥离两个连续 CR 之一(或者更好地说,是用 LF 替换 CR LF 对),我想知道它是否是可以避免这种情况,因为我想使用 gawk 来检测有多少文件有这个奇怪的 CR CR LF 换行符。
我相信这里已经发布了一个非常相似的问题: In Perl, how to match two consecutive Carriage Returns?
【问题讨论】:
-
不,我的问题是 CR CR LF 模式,我没有使用 CYGWIN。我已经通过 GOW 包安装了 gawk。然而,显然唯一的解决方案是要知道在 CR CR LF 上,在将数据流传递给 gawk 之前,一个 CR LF 令牌被 Windows 的 LF 替换,然后如果一些“单个”CR 仍然存在,这意味着这是一个“奇怪" 换行文件类型。我只是希望 gawk 能够像 Notepad++ 显然能够做到的那样解析原始 .txt 文件。