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

时间:2021-03-02 12:54:46

标签: regex perl scripting perlscript

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

stringinput = Sweééééôden@

我想得到类似的输出

stringoutput = Sweden

必须删除 spl 字符 ééééô@

正在使用

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

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

你能建议我添加什么吗

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分:4)

您需要在 LC_ALL=C 命令之前使用 sed 使 [A-Za-z] 字符类按照 ASCII 表创建范围:

stringoutput=$(echo $stringinput | LC_ALL=C sed 's/[^A-Za-z0-9]//g')

online demo

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]”。在其他语言环境中,未指定排序顺序,并且 '[ad]' 可能等效于 '[abcd]' 或 '[aBbCcDd]',或者它可能无法匹配任何字符,或者它匹配的字符集比赛甚至可能不稳定。要获得括号表达式的传统解释,您可以通过将 LC_ALL 环境变量设置为值“C”来使用“C”语言环境。

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

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

this online demo