• 締切済み

ファイル内の文字列を置換

掲示板利用させていただきます。 現在、ファイル内の特定の文字列を置換し、 保存する方法を探しています。 できればスクリプト言語を利用したいと考えています。 sedコマンドを使用して文字列置換を行ったのですが 置換前と置換後のファイルで 文字コードと改行コードが変わってしまうのでダメでした; 「ファイル内の特定の文字列を任意の文字列に置換し、置換前と置換後で改行コードと文字コードを変えない方法」 をご存知の方、ご教示ください。 bash,perl,javaのどれでも結構です。 よろしくおねがいします。

みんなの回答

  • notnot
  • ベストアンサー率47% (4845/10256)
回答No.3

漢字コードが変わるとは考えにくいです。 改行コードに関しては、出力するファイルを置いたディレクトリを含むファイルシステムがtextmodeでマウントされているのかもしれません。 binmodeだと変換しなかったはずですが。 mountコマンドで確認できます。変更の方法はレジストリ修正しか知りません。 cygwinじゃなくてgnu-win32のsedだと -B, --binary use binary read and writes. というオプションがあって、これを指定すると LF の改行だと LF のままです。

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.2

文字エンコーディングや改行の方は良く分かりませんが、 > sedの結果を、そのまま元のファイルに出力、 > つまり > ---------------------------------------------------- > sed -e s/$TAG/$REPLACE/g $TARGET_FILE > $TARGET_FILE > ---------------------------------------------------- > のようにすると、空ファイルが生成されてしまいます。 cygwinのsedであれば、-i オプションで元ファイルの上書きを指定できます。 ただし、バグ持ちなのでバックアップファイルの拡張子を必ず指定してください。 Usage: sed [OPTION]... {script-only-if-no-other-script} [input-file]... 略 -i[SUFFIX], --in-place[=SUFFIX] edit files in place (makes backup if extension supplied)

  • tyatsumi
  • ベストアンサー率58% (30/51)
回答No.1

> sedコマンドを使用して文字列置換を行ったのですが > 置換前と置換後のファイルで > 文字コードと改行コードが変わってしまうのでダメでした; sedで意図せず文字コードや改行コードが変わるとは思えないのですが。 sedでどうやったのか、具体的に書いてもらえれば、 sedでうまくやる方法を探れるかもしれませんよ。

twiggs
質問者

補足

ご回答ありがとうございます。 以下、具体的な方法になります。 (実行環境はcygwin) ---------------------------------------------------- #!/bin/bash TAG='before' REPLACE='after' for TARGET_FILE in $(find ./test -name '*.*'); do  if [ -f $TARGET_FILE ];  then   sed -e s/$TAG/$REPLACE/g $TARGET_FILE > tmp.txt   mv tmp.txt $TARGET_FILE  fi done ---------------------------------------------------- 行っていることは、./test以下のファイルの beforeという文字列をafterに置換する、というものです。 sedの結果を一度tmp.txtに出力し、それを元のファイル名に リネームしています。リネームしたファイルの文字コードが、 必ずshift-jis、改行コードがCR+LFになってしまいます。 たとえば、$TARGET_FILEの文字コードがEUCであった場合、 リネーム後のファイルも、EUCにしたいのです。 尚、./test以下には色々な文字コードのファイルが存在しているため、nkfなどでベタで文字コード変換をかける方法も使用できません。 sedの結果を、そのまま元のファイルに出力、 つまり ---------------------------------------------------- sed -e s/$TAG/$REPLACE/g $TARGET_FILE > $TARGET_FILE ---------------------------------------------------- のようにすると、空ファイルが生成されてしまいます。 もじご存知であれば方法を教えていただけないでしょうか?

関連するQ&A

  • ディレクトリ内の複数ファイルの中から特定の文字列を置換したい

    ディレクトリ内の複数ファイルの中から特定の文字列を置換したい 要は、あるフォルダ内のテキストファイルに含まれる 123を987にしたいということなんですが。 sedは使えなかったんで、 perl -p -i -e 's/123/987/' *.txt としたらできました。 しかし、 perl -p -i -e 's/$rh, $rh1/$rh2, $rh2/' *.cgi のようにスペースを含むとどうもうまくいきません。 教えてください。お願いします。

  • 文字列の置換

    JAVAであるファイル内の文字列を置換するプログラム(日本語)を作りたいのですが、 ・ ・ String h_s; FileReader h_fr = new FileReader(in_filename); BufferedReader h_br = new BufferedReader(h_fr); while(true){  h_s = h_br.readLine();  if (h_s == null){   break;  }  ●文字列を置換するプログラム● } ・ ・ ここの●文字列を置換するプログラム●にあたる適当な関数って何かありますか? たとえばperlでいうと↓みたいなものなのですが・・・ s/置換前文字/置換後文字/g よろしくお願いします。

    • ベストアンサー
    • Java
  • 文字列置換

    UNIXのコマンドで文字列の置換を試みています。 今回行いたい置換としては。。。 12年 1986年2月12日 14 などの文字列を NUM年 NUM年NUM月NUM日 NUM などに、連続した数字をひとまとめにNUMに置換したいと考えています。 文字列の置換方法としてsedコマンドがあると聞いてしらべてみたのですが、いまいいち理解することができませんでした。 自分で考えて試してみたコマンドが以下の通りです。 sed -e "s/\([1-9]\{1,2,3,4\}\)/NUM/g" filename が・・・まったく置換はされませんでした。 よろしければお教えください。よろしくお願いいたします。

  • 文字列置換

    文字列置換 htmlのbody内のタグではない(画面に表示される)特定の文字列を別の文字列に置き換えるコードはどう書けばいいのでしょうか?

  • ファイルの内の文字列の置換について

    質問なんですが、sedコマンドを使用して文字の置換をやってみたんですが、同じファイルに置換した情報を上書きすることは可能でしょうか? 今試した例としては sed -e 's/aaa/bbb/g' test > test と試してみたんですがファイルの内容がなくなってしまっていました。 同じファイルに置換内容を入れることは可能なのでしょうか? 他の方法がある場合は教えてください。 よろしくお願いします。

  • sed で \ を含む文字列に置換

    現在、非常に多数のドキュメントの整形を LaTeXを使って自動的に行っています。 問題となっている処理のエッセンスを抜き出すと次のようなもので、テンプレートファイル中の __PATTERN__ という文字列を、その都度指定する文字列($string)に置換した後にplatexでコンパイルする、という流れです。 ---------- #!/bin/bash sed "s/__PATTERN__/$string/" < template.tex > document.tex platex document.tex ---------- 問題は、$string に '_'(アンダーバー)が含まれるケースで、platexのコンパイルでエラーが発生します。 これを回避するには、'_' を '\_' に置換する必要がありますが、上記処理の前に、$string 中の '_' を '\_' に置換する処理を加えても、上記処理の段階で '\' が消えてしまいます。 肝は sed でのエスケープのやり方だと思うのですが、どうにもうまく行きませんので、お知恵を拝借できればと思います。 なお、tex ファイル中、__PATTERN__ は、他のコマンドの引数内で使用されているため、\verb+ + で囲むという手段も使えません。

  • バッチファイルで文字列を順番問わずマッチさせたい

    バッチファイルで、2個以上の文字列を順番問わずマッチさせたいと考えています。 例えば、 「111 222 333 444 555 666 777」 という内容のテキストファイルがあったとして、 sedコマンドを使って 「222」と「444」と「666」が この順番で含まれている行を置換したい場合、 sed -e "s/.*222.*444.*666.*/置換後の文字列/" in.txt > out.txt とすれば、問題なく置換されると思います。 しかし、上記の例では、 「777 666 555 444 333 222 111」 という内容のテキストファイルは置換されません。 文字列の順番を問わず、 「222」と「444」と「666」が含まれている行ならば、 その行を置換する、といった事は出来ないでしょうか。 sedコマンド以外でも構いませんので、何かいい方法をご存知の方がおられましたらお教え頂けないでしょうか。

  • sedでの複数行にまたがる文字列置換

    スクリプト初心者ながら、少しずつ前進してきました。 特定のサブディレクトリ配下にあるファイルの文字列についてsedコマンドを使って置換しようと思っています。 条件が複数あるため、条件を外出しにして実行しているのですが、複数行またいだ場合の置換方法がわかりません。 例)  /path1/path2/itemname を  /aaa/bbb/itemname  に置換したい。 上記の場合、条件ファイルに s|/path1/path2/itemname|/aaa/bbb/itemname|g で大丈夫だと思うのですが、 /path1/path2/itemname が /path1/path2/ itemname だったり /path1/path2/ itemname だったりと、改行や空行が入って置換対象の文字列が複数行をまたいでいる場合があります。 /\/path1\/path2\//{ N s|/path1/path2/\nitemname|/aaa/bbb/itemname|g } とやってみたら /path1/path2/ itemname だけはうまくいきました。 上の内容は1ファイル中に、複数存在しています。 アドバイスをお願いいたします。

  • Windowsでファイル内の文字列一括置換

    perl初心者です。 Windows上で特定のフォルダ内にあるファイルに書かれている 文字列をperlで一括置換したいのですが、方法がわかりません。 アドバイスをお願いいたします。 やりたいこと。 ・Windows上で実行。 ・特定のフォルダ内にある複数ファイルが対象。 ・置換したい条件は複数で、1ファイル内で複数ヒットするる可能性あり。 ・言語はperl 例) 条件1 ・置換前:tokyoto ・置換後:kanagawaken 条件2 ・置換前:saitamaken ・置換後:tibaken ・ファイル  c:\test1\a\a1.xml  c:\test1\a\a2.xml  c:\test1\b\b1.xml ・a1.xmlの内容  tokyotokawasakishi tokyotoyokohamashi saitamakenitikawashi ・a2.xmlの内容  kanagawakensagamiharashi saitamakentibashi ・b1.xmlの内容 tokyotohiratukashi ↓置換後 ・a1.xmlの内容  kanagawakenkawasakishi kanagawakenyokohamashi  tibakenitikawashi ・a2.xmlの内容  kanagawakensagamiharashi tibakentibashi ・b1.xmlの内容 kanagawakenhiratukashi

    • ベストアンサー
    • Perl
  • perlで特定行から特定行までを抜き出しor置換

    perlで以下のようなことをしたいと考えています。 以下のことを、コマンドラインから「perl ~」という形で 実行したいのですが、どのよにすればよいでしょうか。 1.特定行から特定行までを抜き出し 2.特定行から特定行の範囲で文字列置換 例えば、次のようなテキストファイルがあったとします。 example.txt ================================== #START aaaa hogehoge test okok perl script #END ================================== 上記ファイルを読み込んで、 1.「#START」から「#END」の間に挟まれた行だけ抜き出し 2.「#START」から「#END」の間で、「test」を置換 のです。 sedで言うところの sed -e '/#START/,/#END/ s/YYYYMM/201603/g' test.txt をやりたいのです。

    • ベストアンサー
    • Perl

専門家に質問してみよう