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
相关产品推荐
相关产品推荐

