• 締切済み

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

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

みんなの回答

  • notnot
  • ベストアンサー率47% (4900/10358)
回答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