【发布时间】:2022-12-11 02:40:49
【问题描述】:
问题背景
我们有几千个由 Windows 机器生成的表格数据的大型(10M <行)文本文件,我们需要准备上传到数据库。
我们需要将这些文件的文件编码从cp1252更改为utf-8,用空格替换任何裸 Unix LF 序列(即\n),然后替换 DOS 行结束序列(“CR-LF”,即@ 987654325@) 与 Unix 行结束序列(即 \n)。
dos2unix 实用程序不适用于此任务。
我们最初有一个 bash 函数,它使用 iconv 和 sed 将这些操作打包在一起,iconv 进行编码,sed 处理 LF/CRLF 序列。我正在尝试用 perl 命令替换此 bash 函数的一部分。
示例代码
Based on some helpful code review,我想把这个函数改成perl脚本。
code review 的作者建议如下 perl 将 CRLF(即“\r\n”)替换为 LF(“\n”)。
perl -g -pe 's/(?<!\r)\n/ /g; s/\r\n/\n/g;'
为什么这比我们以前的更好的解释是完全有道理的,但这条线对我来说失败了:
Unrecognized switch: -g (-h will show valid options).
更有趣的是,代码审查的作者还建议也可以在 perl 脚本中执行解码/重新编码,但我完全不确定从哪里开始。
问题
请有人解释为什么建议的答案失败 Unrecognized switch: -g (-h will show valid options).?
如果有帮助,该行应该接收来自 incov 的管道输入,如下所示(尽管我也有兴趣学习如何使用 perl 执行 redcoding/recoding 步骤):
iconv --from-code=CP1252 --to-code=UTF-8 $1$ | \
perl -g -pe 's/(?<!\r)\n/ /g; s/\r\n/\n/g;'
> "$2"
(高度简化的)测试输入示例:
apple|orange|\n|lemon\r\nrasperry|strawberry|mango|\n\r\n
期望的输出:
apple|orange| |lemon\nrasperry|strawberry|mango| \n
【问题讨论】:
-
perl -g -pe 's/(?<!\r)\n/ /g; s/\r\n/\n/g;'不会在 v5.36.0 中产生错误。