Text-Processing
如何從文件中刪除所有軟連字元 (U+00AD)
有一種叫做軟連字元的東西。它的 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)?
只需使用
sed
(我用 GNU 測試過sed
,我不知道非 GNU seds 是否可以做到)並將字元複製/粘貼到 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
and之間的軟連字元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 實現以保留備份以安全測試),然後在所有文件上執行它。