如何从文件中删除所有软连字符 (U+00AD)

如何从文件中删除所有软连字符 (U+00AD)

有一种东西叫软连字符。它的 unicode 值为U+00AD,并且在我的文本编辑器中看不到。

显然,我的一些文件充满了它:

$ perl -C7 -ne 'for(split(//)){print sprintf("U+%04X", ord)." ".$_."\n"}'
n­c
U+006E n
U+00AD ­
U+0063 c
U+000A

n和之间c有一个软连字符。如果你复制这个命令echo n­c,你会发现它有三个字符(而不是两个)。

如何从文件中删除所有软连字符 (U+00AD)?

答案1

只需使用sed(我用 GNU 测试过sed,我不知道非 GNU sed 是否可以做到)并将字符复制/粘贴到 sed 表达式中。在这里,我复制了您的echo n­c命令并运行它,将输出重定向到一个文件,该文件为我提供了一个包含感兴趣字符的测试文件:

$ perl -C7 -ne 'for(split(//)){print sprintf("U+%04X", ord)." ".$_."\n"}' file
U+006E n
U+00C2 Â
U+00AD ­
U+0063 c
U+000A 

它还添加了一个U+00C2 Â我不明白但我不知道 unicode 的内容,所以我认为这是某种 unicode 怪异。该文件看起来与预期一致,实际上有一个看起来像空格的东西,但实际上是 和 之间的软连a字符n

$ cat file
n­c

$ od -c file
0000000   n 302 255   c  \n
0000005

无论如何,复制/粘贴那个明显的空白并将其输入到uniprops, 会给出:

$ uniprops '­'
U+00AD ‹U+00AD› \N{SOFT HYPHEN}
    \pC \p{Cf}
    All Any Assigned C Other Case_Ignorable CI Cf Format Changes_When_NFKC_Casefolded CWKCF Common Zyyy Default_Ignorable_Code_Point DI Graph X_POSIX_Graph
       Latin_1 Latin_1_Supplement Latin_1_Sup InLatin1 Print X_POSIX_Print Unicode

复制到sed替换运算符中给出:

$ sed 's/­//g' file | perl -C7 -ne 'for(split(//)){print sprintf("U+%04X", ord)." ".$_."\n"}'
U+006E n
U+0063 c
U+000A 

换句话说,它正确地删除了它。因此,您可以将该命令应用于所有受影响的文件:

sed -i 's/­//g' file1 file2 ... fileN

首先在几个文件上尝试它(并使用-i.baki .bak根据您的操作系统和 sed 实现来保留备份以便安全地测试),然后在所有文件上运行它。

答案2

使用(以前称为 Perl_6)

raku -pe 's:g/\c[SOFT HYPHEN]//;' file

Raku 提供高级内置 Unicode 支持。无需加载库或记住命令行标志。上面使用了一种识别 Raku 中 Unicode 字符的方法,\c[SOFT HYPHEN]即只需拼出名称即可!或者您可以使用 Unicode 标识符:

raku -pe 's:g/\x00AD//;' file

关于 Raku 版本的熟悉的替换运算符有两点:您可以在 ,或其缩写中紧接着s///放置修饰语(在 Raku 中称为“副词”) 。:globalss:globals:g

其次,上述代码的较少“反斜杠”版本如下:

raku -pe 's:g[\c[SOFT HYPHEN]]="";' file

或者

raku -pe 's:g[\x00AD]="";' file

请参阅有关 Raku 的 Unicode 支持讨论的链接。

https://www.codesections.com/blog/raku-unicode/
https://docs.raku.org/language/unicode

相关内容