问题描述
stringinput = Sweééééôden@
我想得到类似的输出
stringoutput = Sweden
必须删除 spl 字符 ééééô
和 @
。
正在使用
$stringoutput = `echo $stringinput | sed 's/[^a-z A-Z 0-9]//g'`;
我得到了类似 Sweééééôden
的结果,但 ééééô
没有被删除。
你能建议我添加什么吗
解决方法
不需要从 Perl 调用 sed,perl 可以自己做替换。它也更快,因为您无需启动新流程。
#!/usr/bin/perl
use warnings;
use strict;
use utf8;
my $string = 'Sweééééôden@';
$string =~ s/[^A-Za-z0-9]//g;
print $string;
,
您需要在 LC_ALL=C
命令之前使用 sed
使 [A-Za-z]
字符类按照 ASCII 表创建范围:
stringoutput=$(echo $stringinput | LC_ALL=C sed 's/[^A-Za-z0-9]//g')
stringinput='Sweééééôden@';
stringoutput=$(echo $stringinput | LC_ALL=C sed 's/[^A-Za-z0-9]//g');
echo "$stringoutput";
# => Sweden
在默认的C语言环境中,排序顺序是本机字符顺序;例如,“[a-d]”相当于“[abcd]”。在其他语言环境中,未指定排序顺序,并且 '[ad]' 可能等效于 '[abcd]' 或 '[aBbCcDd]',或者它可能无法匹配任何字符,或者它匹配的字符集比赛甚至可能不稳定。要获得括号表达式的传统解释,您可以通过将 LC_ALL 环境变量设置为值“C”来使用“C”语言环境。
在 Perl 中,你可以简单地使用
my $stringinput = 'Sweééééôden@';
my $stringoutput = $stringinput =~ s/[^A-Za-z0-9]+//gr;
print $stringoutput;