You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Perl命令报错'Unrecognized switch: -g'及编码转换+换行符处理方案咨询

Perl命令报错'Unrecognized switch: -g'及编码转换+换行符处理方案咨询

一、为什么会出现'Unrecognized switch: -g'错误?

其实很简单:Perl根本没有-g这个命令行选项,这应该是原代码建议者的笔误。

你要实现的逻辑是把单独的\n替换成空格,再把\r\n换成\n,但如果用默认的-p逐行处理的话,Perl会自动把每行的换行符去掉再处理,导致你根本抓不到那些单独的\n(因为它们已经被当作行分隔符吃掉了)。建议者大概率是想让Perl一次性读取整个文件来处理,这时候应该用-0777选项——这个选项会让Perl把整个输入当作一个字符串来读,而不是逐行拆分,这样才能正确匹配到文本中所有的(?<!\r)\n(也就是前面没有\r的换行符)。

所以修正后的Perl命令应该是:

perl -0777 -pe 's/(?<!\r)\n/ /g; s/\r\n/\n/g;'

二、用Perl一步完成编码转换+换行符处理

既然你想把iconv的工作也交给Perl来做,完全可以实现,这样还能减少管道调用,提升处理效率。

方案1:命令行单行实现

直接在Perl命令里指定输入输出编码,同时处理换行符:

perl -0777 -pe '
    binmode STDIN, ":encoding(cp1252)";
    binmode STDOUT, ":encoding(utf-8)";
    s/(?<!\r)\n/ /g;
    s/\r\n/\n/g;
' "$1" > "$2"
  • binmode STDIN, ":encoding(cp1252)":告诉Perl从标准输入读取的是cp1252编码内容,自动转成Perl内部的Unicode字符串
  • binmode STDOUT, ":encoding(utf-8)":告诉Perl把处理后的Unicode字符串转成utf-8编码输出
  • -0777用来一次性读取整个文件,保证换行符处理的正确性

方案2:写成独立的Perl脚本

如果需要复用,也可以写成一个可复用的小脚本(比如命名为convert_files.pl):

#!/usr/bin/perl
use strict;
use warnings;

die "Usage: $0 <input-file> <output-file>\n" unless @ARGV == 2;
my ($in_file, $out_file) = @ARGV;

# 打开输入文件,指定cp1252编码
open my $in_fh, "<:encoding(cp1252)", $in_file or die "Can't open $in_file: $!";
# 打开输出文件,指定utf-8编码
open my $out_fh, ">:encoding(utf-8)", $out_file or die "Can't open $out_file: $!";

# 一次性读取整个文件内容
local $/;
my $content = <$in_fh>;

# 处理换行符
$content =~ s/(?<!\r)\n/ /g;
$content =~ s/\r\n/\n/g;

# 写入输出文件
print $out_fh $content;

close $in_fh;
close $out_fh;

使用时先给脚本加执行权限:chmod +x convert_files.pl,然后运行:

./convert_files.pl input.txt output.txt

三、测试验证

用你提供的测试输入:

apple|orange|\n|lemon\r\nrasperry|strawberry|mango|\n\r\n

经过上述命令或脚本处理后,会得到你想要的输出:

apple|orange| |lemon\nrasperry|strawberry|mango| \n

备注:内容来源于stack exchange,提问作者rxFt20

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.23 07:08:01