如何替换除西班牙语字符以外的所有Unicode字符?

3
我试图从文件中删除除西班牙字符外的所有Unicode字符。匹配不同的元音字母并没有任何问题,使用以下正则表达式不会替换áéíóúÁÉÍÓÚ(但所有其他Unicode似乎都被替换了):perl -pe 's/[^áéíóúÁÉÍÓÚ[:ascii:]]//g;' filename。但是,当我将倒问号¿或感叹号¡添加到正则表达式中时,其他Unicode字符也被匹配和排除,而我想要删除它们:perl -pe 's/[^áéíóúÁÉÍÓÚ¡¿[:ascii:]]//g;' filename不会替换以下内容(有些不可打印):³ � � ­。我是否遗漏了明显的东西?我也愿意尝试在终端上以其他方式完成此操作。

输入是如何编码的? - mob
尝试运行 perl -CIOED -pe 's/[^áéíóúÁÉÍÓÚ[:ascii:]]//g;' filename - Wiktor Stribiżew
为了直接在Perl代码中包含UTF-8编码的字符(这可能是您的终端发送的内容),您需要使用use utf8;-Mutf8。此外,您的输入必须进行解码,输出必须重新编码,因为文件始终以某种编码方式存在。文件的编码很可能是UTF-8,如果是这种情况,则-CSD(相当于@WiktorStribiżew提到的-CIOED)将执行此编码,但您应该确定这一点。 - Grinnz
感谢您的反馈@WiktorStribiżew和@Grinnz。使用 perl -CIOED -pe 's/[^áéíóúÁÉÍÓÚ¡¿[:ascii:]]//g;' testing 可以删除所有Unicode字符,但保留了倒置的问号和感叹号,但不会保留预期的 áéíóúÁÉÍÓÚ 字符。我正在尝试保留áéíóúÁÉÍÓÚ¡¿并从UTF-8输入文件中删除所有其他Unicode(仅保留ASCII)。 - wazy
你忘记了ñ和ü,顺便说一下(我不认为西班牙语在其他元音字母上使用分音符,但我已经生疏了)。 - Shawn
显示剩余4条评论
1个回答

1
你有一个UTF8编码的文件并且使用Unicode字符,因此,需要传递一组特定的选项以让Perl知道这一点。
你应该添加-Mutf8以让Perl识别在Perl代码中直接使用的UTF8编码字符。
此外,你需要传递-CSD(相当于-CIOED),以便解码输入并重新编码输出。这个值是与编码相关的,它将适用于UTF8编码。
perl -CSD -Mutf8 -pe 's/[^áéíóúñüÁÉÍÓÚÑÜ¡¿[:ascii:]]//g;' filename

请勿忘记 Üü

我也注意到Ñ和ñ,显然。 - tripleee
1
@tripleee 好的,可以添加或删除更多内容,幸运的是,这是最小的问题。 - Wiktor Stribiżew

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接