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


33

例えば:

sed 's/\u0091//g' file1

今、hexdump16進数を取得しsed、次のように入力する必要があります。

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

その後:

$ sed 's/\xe9\xa6\x91//g' file1

回答:


28

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

sed 's/馑//g' file1

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

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

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


1
sedは馑を1文字または3文字としてカウントしますか?つまり、echo 馑 | sed s/...//何かを印刷しますか?
user253751

以来@immibis sedグラム修飾子持って、彼らはお互いに従うとき、それはまた、すべての発生を置き換えます。また、1つの文字としてカウントする必要がありsedを参照してくださいecho -ne "馑" | wc -mできます1。バイト(wc -c)を数えると戻り3ます。あなたの質問を正しく理解しましたか?
カオス

私は意味:ない.平均「1つの文字」または「1バイト」?
user253751

@immibis私は1つの文字に一致するためecho 馑 | sed s/...//、私に与えられます(何も置き換えられません)
カオス

4
@chaos:で動作しますがen_US.UTF-8、では動作しませんC
チョロバ

15

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

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

-CS 標準入力、出力、エラーに対してUTF-8を有効にします。


7
Perlはほとんど何でもできます
。....-wobbily_col

6

sedUnicode をサポートする多くのバージョン

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

BSD sedに関する情報を見つけることができませんでしたが、これは奇妙だと思いましたが、Unicodeもサポートしている可能性は高いと思います。残念ながら、sedどのエンコードを使用するかを指示する標準的な方法はないため、それぞれが独自の方法でこれを行います。


BOMの有無にかかわらずUTF-16をサポートしていますか?
ボン亜美

10
UTF-16は、UnixベースのOSではほとんど使用できません。それはまた、日の目を見たことがなかったはずの憎しみでもあります。
ブライアンBi

それらがUTF-16をサポートするかどうかは実装に依存し、そのデータを持っていないのではないかと心配しています。Plan 9 sedはそうだとは思いませんが(元のOSはどこでもUTF-8です)、私は確信できません。
スプーニエスト

2

これは私のために働く:

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

それは私が望むよりも冗長なドロップです。完全な説明は次のとおりです。

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

私はこれfile1 がインプレースを変更すると思います、それは正しいですか?
ゲリット

@gerritそれは正しいです、そしてそれを指摘してくれてありがとう。
レイブタウログ

1

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

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

これは新しく受け入れられた答えで、シンプルできれいなはずです!
アレン王

0

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

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

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.