3

我有一个如下的字符串

stringinput = Sweééééôden@

我想得到像

stringoutput = Sweden

spl 字符 ééééô 并且@必须被删除。

我正在使用

$stringoutput = `echo $stringinput | sed 's/[^a-z  A-Z 0-9]//g'`;

我得到了类似的结果, Sweééééôdenééééô没有被删除。

你能建议我补充什么吗

4

2 回答 2

4

无需从 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;
于 2021-03-02T13:01:30.067 回答
4

您需要使用LC_ALL=Cbeforesed命令使[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 正则表达式参考

在默认的 C 语言环境中,排序顺序是本机字符顺序;例如,“[ad]”等价于“[abcd]”。在其他语言环境中,未指定排序顺序,并且“[ad]”可能等同于“[abcd]”或“[aBbCcDd]”,或者它可能无法匹配任何字符或它所匹配的字符集匹配甚至可能是不稳定的。要获得括号表达式的传统解释,您可以通过将 LC_ALL 环境变量设置为值“C”来使用“C”语言环境。

在 Perl 中,您可以简单地使用

my $stringinput = 'Sweééééôden@';
my $stringoutput = $stringinput =~ s/[^A-Za-z0-9]+//gr;
print $stringoutput;

请参阅此在线演示

于 2021-03-02T13:03:01.887 回答