Unicode対応のsedが存在するのか?

このQ&Aのポイント
  • WindowsでUTF8日本語を処理できるsedは未だ存在しないのか?
  • SJISの日本語文章は正しく動作するが、Unicodeのファイルの日本語処理は動作しない。
  • UTF8の入力ファイル、スクリプトファイル(.sed)を使用すると正しく動作しない。sedを処理可能なものは存在するのか?
回答を見る
  • ベストアンサー

Unicode 対応の sed って無いのですか?

Windows でUTF8 日本語を処理できる sed は未だ存在しないのでしょうか? SJIS の日本語文章は正しく動作しますが、unicode のファイルの日本語処理は動作しません。 utf8 の入力ファイル、スクリプトファイル(.sed)を使用すると正しく動きません。 処理可能な sed はありますか? 例えば:  in.txt の内容 = 日本語, script.sed 内容= s/日本語/jjjj/ の uft8 ファイル、とし、 sed -f script.sed in.txt > ot.txt を実行 →エラー発生。 no such command as ・ソs/譌・譛ャ隱・jjjj/ と文字化け?。・ソ、ってゴミ?。 (日本語なしの script でも同一) script.sed をSJIS とすると、エラーは出ないが、ot.txt は空。 (色々の sed で確認しましたが、onigsed での --ctype=utf8 指定も駄目でした。)

質問者が選んだベストアンサー

  • ベストアンサー
  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

in.txt,script.sedを書くのに、どんなエディタを使いましたか? おそらくは、BOMの問題です。 「BOM無し」とか「UTF-8N」とか(「UTF-8(BOM有り)」に対しての)「UTF-8」とかのエンコードが選べるテキストエディタを使ってみてください。 http://ja.wikipedia.org/wiki/%E3%83%90%E3%82%A4%E3%83%88%E3%82%AA%E3%83%BC%E3%83%80%E3%83%BC%E3%83%9E%E3%83%BC%E3%82%AF

unbootable
質問者

お礼

有難うございます。当たりでした。Bom 無し script.sed に変更したら、正常動作しました。 ご参考(復習): sed は、Logos sed (ミドリノセロー氏、1991年版 ---古い!)使用 script.sed は MS メモ帳で作成(保存時の文字コード(E):UFT-8) です。 まず、下記 UTF-8(BOMなし)で保存出来るエディター http://msweb.moo.jp/tool/223/ で紹介されている online editor - Multilingual Editor http://multilingual-editor.sugutsukaeru.jp/ja/ にかまして、BOM 無しの script_nobom.sed 入手。 sed -f script_nobom.sed in.txt > ot.txt cannot open command-file script_nobom.sed だって。8.3制限 に抵触(ボロ)。--- 名前を8文字以内に変えて、リトライ。 sed -f script_n.sed in.txt > ot.txt →成功。 ot.txt も  jjjj に変わっていた。 ------ 感謝・感謝。 本当に有難う。でも、この辺のこと余り世の中に書いてありませんね。良くない、ですネ。 onigsed って一体何なの。必要ないのでは??。そもそも何言ってんだか分からない文章で、ちょっと遺憾。

unbootable
質問者

補足

さらに、補足しておきます。 debug script.sed でバイナリダンプを取り内容確認したら、 EF BB BF の頭が s/ の前についていた。 http://www.atmarkit.co.jp/fwin2k/win2ktips/775hexdump/hexdump.html ファイルの内容をバイナリ・ダンプで確認する。(d コマンドと、q コマンド使用) ------------------ 尚、BOM 削除は、次の、onigsed (2009 年版)の 16進コード指定の置換で可能だった。 onigsed "s/\xef\xbb\xbf//" script.sed > no_bom.sed  (1) (onigsed "s/^\xef\xbb\xbf//" script.sed > no_bom.sed も可) ------------------ Onigsed の場合、in.txt が UTF8 の場合、--ctype=UTF8 指定が必須だった。 --ctype=UTF8 指定をしないと、エラーなしの空振りだった。 Logos sed の方が --ctype=UTF8 指定など不要なので操作性は良い。 (入力 file と .sed file の encode を同じ色にしておけばいいだけ) ---------------- 尚、Logos sed では、小なり記号 <、大なり記号 >、を指定した操作(ex. html ファイルの tag 指定の操作等)は、.sed script file を使用しないと出来ない。なぜなら <, > 記号は リダイレクション記号の予約記号だから。

関連するQ&A

  • SED スクリプトファイルを複数のファイルに作用させたい。

    SEDのスクリプトファイル(henkan.sed)を作りました。 このスクリプトを実行させたい対象ファイルが15個あります。(temp01.txt~temp15.txt) > sed -f henkan.sed temp01.txt > kekka01.txt > sed -f henkan.sed temp02.txt > kekka02.txt           ・           ・           ・ > sed -f henkan.sed temp15.txt > kekka15.txt これはあまりにもしんどいです。何かよい方法はあるでしょうか。 また、コマンドラインから一つのスクリプトファイルを複数の対象ファイルに作用させることは可能でしょうか。 よろしくお願いします。

  • ザウルスのLinuxでSEDのスクリプトファイルを使いたい

    ザウルス(SLC1000)のターミナル(qpe-embeddedkonsole-ja Ver 1.6.0)で、 SED(sed-ja/GNU sed Ver. 3.02)のスクリプトファイルが使えず困っています。 ----- in.txt ----- 12345 abcde ------------------ +++++ s.sed +++++ 1q +++++++++++++++++ 上記ファイル内容で、ターミナル上で bash-2.05$ sed -e "1q" in.txt は問題なく出力されますが、 bash-2.05$ sed -f s.sed in.txt では、 sed: file s.sed line 1: Extra characters after command と出ます。スクリプトファイルでも["]記号が必要かも知れないと思い s.sed を下記のように変えると +++++ s.sed +++++ "1q" +++++++++++++++++ sed: file s.sed line 1: Unknown command: ”" ” と出ます。 初歩的な何か抜けているのだと思いますが抜け出せずに居ます。 宜しくお願いいたします。 以上

  • sedスクリプト 置換

    この度、はじめてsedスクリプトをかいてみようと思っています。 以下の機能を持った置換スクリプトを書きたいのですが、 アドバイスなど頂ければ幸いです。 ・abcディレクトリ内を検索して(サブディレクトリも含む)、test.txtというファイルを探し出す(test.txtは複数あります) ・検索された複数のtext.txtを一括で置換する ↓置換内容 ・test.txtの5行目にある文字列を1からはじまる連番に置換する(test.txtは複数あるので、処理した順に連番をつけていく) イメージが伝わりにくい場合は、どうかご指摘ください。 よろしくお願いします

  • sed -f のエラー対策を、教えて下さい。

    sed -f work.sed hoge.txt を実行すると、"sed: 1: work.sed: bad flag in substitute command: 's'"となる。 work.sed(文字コード: utf8)の内容は、以下の通りです。 s/キーワード/文字/g 動作確認環境 ・Mac 10.5のターミナル ・サクラサーバーを、ターミナル上でリモート操作しました。 二つの環境で同じ動作でした。 これに対する対応策を、ご教示ください。

  • sedでの改行置換

    sedを用いた処理で質問があります。 出力結果の改行を置換して一列として表示しようとしているのですが、どうもうまくいきません。 (perlは敢えて使いません) 例えば、以下のようなファイルがあるとして、 $ cat hoge.txt hoge boo bar この出力結果を加工して、「hoge boo bar」のように、 改行をスペースに置換して一行として表示したい場合は、どのようにすれば良いでしょうか? ちなみに、以下のような使い方だと、うまくいきませんでした。 $ cat hoge.txt | sed 's/\ > / /g' $ cat hoge.txt | sed 's/\n/ /' ■実行環境 OS : RedHat EL 1 sedのバージョン : sed-4.0.7-3 宜しくお願い致します。

  • 複数パターンのsed文についての質問です。

    sedの使い方がよく分からない為、教えてください。 テキストの中で、同じパターンスペースに対して、 別の文字を置換させたいと考えています。 (一つ目のマッチングには、yyy 二つ目には、zzzなど) sed文ではコマンドブロックの書き方がわからないので、 sedスクリプトを別に用意してファイルを読み込ませた所、 うまくいきました。 sed -f test.sed test.txt しかし、第二段階として、置換文字列を変数にしたところ、 変数展開ができませんでした。実際には変数展開を考えているので、 困っているところです。 この問題を解決できるようなsed文(sed -e)か、sedスクリプトを 教えて頂きたく宜しくお願いいたします。 下記、テスト材料です。 一つ目のabcを $HOMEに、 二つ目のabcを $SHELLに置き換えたいです。 text.txt (編集元テキスト) ------------------ User yyyyy abc Pass zzzzz abc ------------------- test.sed(SEDスクリプト) --------------------- /User/{ N N s/abc/$HOME/ N N N s/abc/$SHELL/ } ----------------------

  • sedの置換文字に変数を使用したいのですが・・・

    あるファイルの特定の文字を変換し、上書きをする処理を行いたいのですが、sedの置換文字に変数が渡せなくて困っています。 例: X="a" Y="b" echo test.txt | sed 's/${X}/${Y/g}' >test.txt sedでは置換文字に${X}といった変数を使用することはできないのでしょうか?

  • sedコマンドでのエスケープ文字の扱い

    はじめまして。Linuxのsedコマンドで困っています。 sedの置換文字列として連続する\をリテラルとする処理を考えていますが、\がいくつ入ってくるか(変数)、わからない場合において、複雑な処理なしに対処できないか、考えています。 ↓簡単な例ですが、コマンドベースで説明すると以下のようなものです。 $ var='\\' $ cat file.txt aa $ sed "s/.*/$var/" file.txt \ という結果になりますが、置換文字を変数から取る際に、連続する\が設定されるケースを想定したプログラムを組むたいと思っています。 \が入ってくる個数がわかるのであれば、\を2倍にセットしておけばできそうですが、いくつセットされてくるかはわからない場合、何かよい方法はないでしょうか。 念のため、Linux環境で、GNU sed 4.1.2版で試行しています。シェルはbashです。よろしくお願いします。

  • sedコマンドの置換パターン条件について

    シェルスクリプトについて質問です。 /etc/ssh/sshd_configのAllowUsers行にユーザを追加&削除、sshdをリスタートするスクリプトを作っています。 ユーザ追加の処理はsedコマンドで実現できました。 sed -i -e "s/^AllowUsers/AllowUsers $USERNAME/" $CONF_FILE そして、悩んでいるのがユーザ削除時の処理です。 "AllowUsersで始まる行の中で" 且つ "変数$USERNAME" に一致する部分を削除するという処理です。sedは複数条件を指定することもできますが、以下記述の場合、2つの条件が独立して処理されてしまいます。 sed -e "s/^AllowUsers/AllowUsers/" -e "s/ $USERNAME//" $CONF_FILE ($USERNAMEに一致する部分はAllowUsersで始まらない行でも置換される) sedにAND条件のような使い方は可能でしょうか。 環境はCentOS 5.3、シェルはbashを使っています。 よろしくお願いいたします。

  • 現在の文字コードの確認

    お世話になります。 以下のシェルスクリプトでテキストファイルの文字コードをUTF8に変換したあと、 返還後の文字コードを確認するステップを追加したいと考えています。 ------------------------------------- #!/bin/sh for f in `ls *.txt` do iconv -f SJIS -t UTF8 < $f > utf8-$f done ------------------------------------- 次のようなスクリプトを作成しましたが正常に処理が行われませんでした。 どのように記述すればよいでしょうか。 ------------------------------------- #!/bin/sh for f in `ls *.txt` do iconv -f SJIS -t UTF8 < $f > utf8-$f nkf -g < $f > done ------------------------------------- ご協力のほどよろしくお願いいたします。