有一种东西叫软连字符。它的 unicode 值为U+00AD
,并且在我的文本编辑器中看不到。
显然,我的一些文件充满了它:
$ perl -C7 -ne 'for(split(//)){print sprintf("U+%04X", ord)." ".$_."\n"}'
nc
U+006E n
U+00AD
U+0063 c
U+000A
n
和之间c
有一个软连字符。如果你复制这个命令echo nc
,你会发现它有三个字符(而不是两个)。
如何从文件中删除所有软连字符 (U+00AD)?
答案1
只需使用sed
(我用 GNU 测试过sed
,我不知道非 GNU sed 是否可以做到)并将字符复制/粘贴到 sed 表达式中。在这里,我复制了您的echo nc
命令并运行它,将输出重定向到一个文件,该文件为我提供了一个包含感兴趣字符的测试文件:
$ 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
nc
$ 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.bak
或i .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 中称为“副词”) 。:global
s
s:global
s: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