regex 快速多行正则表达式查找/替换\r和\n

vxqlmq5t  于 2023-05-13  发布在  其他
关注(0)|答案(3)|浏览(109)

我正在处理大型文本数据集,大小约为1GB(最小的文件约有200万行)。每一行都应该被分成若干列。我说“假设”是因为有例外;虽然正常的线以\r\n结束,但是它们中的大量被不正确地划分成2到3条线。
假设有10列,每行应该具有以下格式:

col_1 | col_2 | col_3 | ... | col_10\r\n

例外情况的格式如下:

1.  col_1 | col_2 | col_3 ...\n
    ... | col_10\r\n

2.  col_1 | col_2 | col_3 ...\n
    ... | col_10\n
    \r\n

纠正这些异常的最快方法是什么?我在文本编辑器(TextMate,在Mac上)中使用正则表达式(^[^\r\n]*)\n(替换为$1)对1000行的示例进行了简单的查找/替换,它工作得很好。但是文本编辑器显然不能处理大文件(>= 200万行)。这些可以用sedgrep(或在其他命令行工具中,甚至在Python中)使用等效的正则表达式来完成吗?如何完成?

cbjzeqam

cbjzeqam1#

您的方法:

perl -pe 's/(^[^\r\n]*)\n/\1/' input > output

或者,消极的lookbehind:

perl -pe 's/(?<!\r)\n//' input > output

或者,删除所有\n,并将每个\r替换为\r\n

perl -pe 's/\n//; s/\r/\r\n/' input > output
fcwjkofz

fcwjkofz2#

为什么不awk?:

awk 'BEGIN{RS="\r\n"; FS="\n"; OFS=" "; ORS="\r\n";} {print $1,$2}' input

或tr + sed:

cat input | tr '\n' ' ' | tr '\r' '\n' | sed 's/^ \(.*\)/\1\r/g'
ohtdti5x

ohtdti5x3#

不需要花哨的regex-只需5个awk内置变量就足够了:

awk 'BEGIN { ORS=RS="\r"(FS="\n"(OFS=_)) } ++NF'

相关问题