web-dev-qa-db-ja.com

Unicodeをサポートするsedの代替はありますか?

例えば:

sed 's/\u0091//g' file1

現在、16進数を取得してhexdumpに入れるには、次のようにsedを実行する必要があります。

$ echo -ne '\u9991' | hexdump -C
00000000  e9 a6 91                                          |...|
00000003

その後:

$ sed 's/\xe9\xa6\x91//g' file1
35
A-letubby

その構文を使用してください:

sed 's/馑//g' file1

またはエスケープされた形式で:

sed "s/$(echo -ne '\u9991')//g" file1

(古いバージョンのBashと一部のシェルはecho -e '\u9991'を理解しないため、最初に確認してください。)

29
chaos

Perlはそれを行うことができます:

echo 汉典“馑”字的基本解释 | Perl -CS -pe 's/\N{U+9991}/Jin/g'

-CSは、標準入力、出力、およびエラーに対してUTF-8をオンにします。

16
choroba

いくつかのバージョンのsedはUnicodeをサポートしています

  • Heirloom sed 、「オリジナルのUnixマテリアル」に基づいています。
  • GNU sed 、これは独自のコードベースです。
  • Plan 9 sed 、これはUnixライクなオペレーティングシステムに移植されました。

奇妙だと思ったBSD sedの情報はありませんでしたが、Unicodeにも対応している確率は高いと思います。残念ながら、使用するエンコーディングをsedに指示する標準的な方法はないため、それぞれが独自の方法でこれを行います。

6
The Spooniest

これは私にとってはうまくいきます:

$ vim -nEs +'%s/\%u9991//g' +wq file1

それは私が望んでいるよりも少し落ち込んでいる。ここに完全な説明があります:

  • -n vimスワップファイルを無効にする
  • -E Ex改良モード
  • -sサイレントモード
  • +'%s/\%u9991//g'置換コマンドを実行します
  • +wq 保存して終了
4

最近のバージョンのBASHでは、sed式の前後の引用符を省略すれば、BASHのエスケープ文字列を使用できます。ワイルドカードを個別に引用できるため、BASHによって解釈される可能性のあるsed式内のスペースまたはsed式の一部。

$ echo "饥馑荐臻" | sed s/$'\u9991'//g
饥荐臻
2
Dave Rove

GNU sed(バージョン4.2.1):

$ echo -ne $'\u9991' | sed 's/\xe9\xa6\x91//g' | hexdump -C
$ echo -ne $'\u9991' | hexdump -C
00000000  e9 a6 91

sedの代替として、GNU awkを使用することもできますが、必要ないようです。)

1
Janis