Text-Processing

如何從文件中刪除所有軟連字元 (U+00AD)

  • February 9, 2022

有一種叫做軟連字元的東西。它的 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

在 和 之間nc有一個軟連字元。如果你複製這個命令echo n­c,你會發現它有三個字元(不是兩個)。

如何從我的文件中刪除所有軟連字元 (U+00AD)?

只需使用sed(我用 GNU 測試過sed,我不知道非 GNU seds 是否可以做到)並將字元複製/粘貼到 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 怪異。該文件看起來像預期的那樣,實際上看起來像一個空格,但實際上是aand之間的軟連字元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 實現以保留備份以安全測試),然後在所有文件上執行它。

引用自:https://unix.stackexchange.com/questions/689828