我有一个像下面这样的字符串
stringinput = Sweééééôden@
我想得到像
这样的输出stringoutput = Sweden
spl字符ééééô
和@
必须被删除。
使用我
$stringoutput = `echo $stringinput | sed 's/[^a-z A-Z 0-9]//g'`;
我得到的结果像Sweééééôden
,但ééééô
没有被删除。
你能建议我需要补充什么吗?
您需要在sed
命令之前使用LC_ALL=C
来使[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
参见POSIX regex reference:
在Perl中,您可以简单地使用在默认的C语言环境中,排序顺序是本地字符顺序;例如,' [a-d] '相当于' [abcd] '。在其他语言环境中,没有指定排序顺序,' [a-d] '可能相当于' [abcd] '或' [aBbCcDd] ',或者它可能无法匹配任何字符,或者它匹配的字符集甚至可能不稳定。要获得括号表达式的传统解释,可以通过将LC_ALL环境变量设置为值' C '来使用' C '语言环境。
my $stringinput = 'Sweééééôden@';
my $stringoutput = $stringinput =~ s/[^A-Za-z0-9]+//gr;
print $stringoutput;
查看这个在线演示。
不需要从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;