使用 perl 脚本从字符串中删除特殊字符
Posted
技术标签:
【中文标题】使用 perl 脚本从字符串中删除特殊字符【英文标题】:Removal of special characters from string using perl script 【发布时间】:2021-06-01 00:31:50 【问题描述】:我有一个类似下面的字符串
stringinput = Sweééééôden@
我想得到类似的输出
stringoutput = Sweden
必须删除 spl 字符 ééééô
和 @
。
正在使用
$stringoutput = `echo $stringinput | sed 's/[^a-z A-Z 0-9]//g'`;
我得到类似Sweééééôden
的结果,但ééééô
没有被删除。
你能建议我补充什么吗
【问题讨论】:
你需要stringoutput=$(echo $stringinput | LC_ALL=C sed 's/[^A-Za-z0-9]//g');
【参考方案1】:
不需要从 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;
【讨论】:
我的错。此评论将自毁。【参考方案2】:您需要在sed
命令之前使用LC_ALL=C
以使[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。
【讨论】:
非常感谢。我的 $stringoutput = $stringinput =~ s/[^A-Za-z0-9]+//gr;这行得通。但是当我将 / 添加到正则表达式时 .. 因为我不希望 / 出现在像 PO BOX 29794/MACééééô S3929-033 这样的字符串输入中,它在 Unmatched [ in regex; 下抛出了一个错误;由 @sravanisrinija 您在括号内使用了-
,对吧?转义它(或放在括号表达式的末尾)。另外,转义/
。 my $stringoutput = $stringinput =~ s/[^A-Za-z0-9 .,\/-]+//gr;
谢谢。这有帮助。
注意:两者都假设一个 NFC 字符串并且对于 NFD 字符串失败(产生 Sweeeeeoden 而不是瑞典)。见Unicode Equivalence以上是关于使用 perl 脚本从字符串中删除特殊字符的主要内容,如果未能解决你的问题,请参考以下文章