Perl 将特殊字符替换为空白

Perl 将特殊字符替换为空白,perl,awk,sed,Perl,Awk,Sed,你有没有办法把所有的特殊字符翻译成空格 ^@^@^@^@<9C>^G^@^@*+^@^@ABD ^@^@^@^@*+^@^@<DC>_^@^@ASD ^@^@^@^@*+^@^@<DC>_^@^@ASaa ^@^@^@^@<80><C2>^A^@<C2>p^A^@ABD 兽医 ^@^@^@^@<9C>^G^@^@*+^@^@ABD$ ^@^@^@^@*+^@^@<DC>_^@^@ABD$ ^@^@^

你有没有办法把所有的特殊字符翻译成空格

^@^@^@^@<9C>^G^@^@*+^@^@ABD
^@^@^@^@*+^@^@<DC>_^@^@ASD
^@^@^@^@*+^@^@<DC>_^@^@ASaa
^@^@^@^@<80><C2>^A^@<C2>p^A^@ABD
兽医

^@^@^@^@<9C>^G^@^@*+^@^@ABD$
^@^@^@^@*+^@^@<DC>_^@^@ABD$
^@^@^@^@*+^@^@<DC>_^@^@ABD$
^@^@^@^@<80><C2>^A^@<C2>p^A^@ABD$
还是从这个

而且产出也不符合预期

输出

ABD
ASD
ASaa
ABD

“特殊字符”没有通用定义,您可能需要指定要保留的字符——因此删除除这些字符以外的所有字符

$string =~ s/[^a-zA-Z0-9_,.-]//g;  # etc, spell out what to leave 
您可以使用单词字符模式
\w

$string =~ s/[^\w,.-]//g;
我只举了几个标点符号的例子

您尝试使用的POSIX字符类也可以工作

$string =~ s/[^[:alnum:][:punct:]]/;
或者以
\p
为了他们

当然,我们也可以在上面链接的综合页面上找到实际的Unicode属性。小心语法;请参阅中的“POSIX字符类”部分

或者您真的想删除不可打印的字符

$string =~ s/[^[:print:]]//g;

将其用作命令行程序(“一行程序”)

将输出另存为
新文件
,或

perl -i.bak -wpe's/[^[:print:]]//g' file
更改文件的位置(如果不需要备份,请删除
.bak

如果输入是从另一个程序通过管道传输的

echo input | perl -wpe's/[^w,.-]//g'

你能给我们看一下你文件的
od
输出,或者
cat-vET
输出吗?你好像在试图剥洋葱皮。这个问题有点不清楚,你不认为吗?另外,OP似乎在寻找一个命令行解决方案,所以至少,你应该知道这是一个Perl脚本片段。@kvantour I thikn这是一个非常常见的问题(也有其非特定性)把它说清楚是很有用的here@user10254032我认为这是一个很好的问题,我不知道-1代表什么(向上投票)@user10254032我已经清理了POSIX字符类与Unicode属性的使用,并添加了另一个参考。只是让你知道。。。
$string =~ s/[^[:print:]]//g;
perl -wpe's/\W//g' file > new_file
perl -i.bak -wpe's/[^[:print:]]//g' file
echo input | perl -wpe's/[^w,.-]//g'