というものがあります。ソフトハイフン。 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
(2つではなく)3つの文字があることがわかります。
ファイルからすべてのソフトハイフン(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
まず、いくつかのファイルを試してみて(そして安全なテストのためにOSとsedの実装に基づいてバックアップを使用またはアーカイブしてから)、すべてのファイルに対して実行してください-i.bak
。i .bak
答え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バージョンのおなじみの代替演算子に注意する2つの点: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/言語/unicode