使用perl脚本从字符串中删除特殊字符



我有一个像下面这样的字符串

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:

在默认的C语言环境中,排序顺序是本地字符顺序;例如,' [a-d] '相当于' [abcd] '。在其他语言环境中,没有指定排序顺序,' [a-d] '可能相当于' [abcd] '或' [aBbCcDd] ',或者它可能无法匹配任何字符,或者它匹配的字符集甚至可能不稳定。要获得括号表达式的传统解释,可以通过将LC_ALL环境变量设置为值' C '来使用' C '语言环境。

在Perl中,您可以简单地使用
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;