• ベストアンサー

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

TelnetでLinuxにログインしています。 ディレクトリ内の複数ファイルの中から特定の文字列を置換したいのですが、その方法(コマンド)がわかりません。 例えば、/webディレクトリ内にある全ファイルの中から、「abc」という文字列を見つけて、それを「xyz」に置換したいのです。 どうぞ、ご指南の程、宜しくお願い致します。

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

  • ベストアンサー
  • Yeti21
  • ベストアンサー率47% (396/830)
回答No.2

こんな感じでしょうか? cd /web for name in `ls *.txt`;do sed -i s/abc/xyz/g $name;done .txt拡張子のファイル全て 「abc」を「xyz」に置換え

その他の回答 (6)

noname#39970
noname#39970
回答No.7

>shift_jisのHTMLファイルの場合、日本語を置き換えすると、文字化け シェルがEUCで動いてるからじゃ? 間に iconv 挟んでみるとか

  • Yeti21
  • ベストアンサー率47% (396/830)
回答No.6

申し訳ありません。 サブディレクトリに日本語となると、簡単な方法はちょっと思いつきません。

wdwdwd
質問者

お礼

いえいえ、大変参考になりました。

  • Yeti21
  • ベストアンサー率47% (396/830)
回答No.5

何度もすみません。 誤字です。 置き返されます→置き換えされます ちなみに、perlの方はforループは不要です。 No.4の例で*.txtで複数ファイル指定になります。 cd /webの後に実行してみてください。

wdwdwd
質問者

お礼

ご返信有難うございます。 早速、試してみました。 なるほど、確かに置換ができました!助かりました。 ただし、以下の2つ想定外のことが起きました。 1つ目は、/web以下のサブディレクトリにあるファイルが置換できないことです。 2つ目は、shift_jisのHTMLファイルの場合、日本語を置き換えすると、文字化けしてしまうことです。 もし、対処法があればの話しですが、おわかりであれば、ご指南いただけると勉強になります。

  • Yeti21
  • ベストアンサー率47% (396/830)
回答No.4

Linuxにも色々有りますので、残念ですが、sedがin-placeの使えない版のようです。 こちらは、Perlが使える前提ですが、こういうのもあります。 (例1) perl -p -i -e 's/abc/xyz/' *.txt (例2) perl -p -i.bak -e 's/abc/xyz/' *.txt 動作はどちらも元ファイル(*.txt)が置き返されますが、例2は元ファイルに~.bakと ファイル名の後ろに拡張子を追加して保存します。 こちらが使えれば簡単なんですが。

  • Yeti21
  • ベストアンサー率47% (396/830)
回答No.3

補足ですが、 sedで-iを指定するとインプレース、つまり直接置換えを行います。 そうでなければ、元ファイルは更新せず、置き換えた結果を別途 出力するという指定になります。

wdwdwd
質問者

お礼

早速のご返信ありがとうございました。 コマンドを直接ご記載頂いたので、慣れていない私にとって大変助かります。 さて、教えて頂いたとおりに、打ち込んでみましたが、エラーが発生して、処理ができていないようでした。 何か誤っているのでしょうか。。 [root@hoge test]# for name in `ls *.txt`;do sed -i s/abc/xyz/g $name;done sed: invalid option -- i Usage: sed [OPTION]... {script-only-if-no-other-script} [input-file]... -n, --quiet, --silent suppress automatic printing of pattern space -e script, --expression=script add the script to the commands to be executed -f script-file, --file=script-file add the contents of script-file to the commands to be executed --help display this help and exit -V, --version output version information and exit If no -e, --expression, -f, or --file option is given, then the first non-option argument is taken as the sed script to interpret. All remaining arguments are names of input files; if no input files are specified, then the standard input is read. ・・・・・・・・・・・・

  • fxdwg99
  • ベストアンサー率45% (43/94)
回答No.1

これは下記のようにsedコマンドを使えば可能です。 sed s/abc/xyz/g < in-file > out-file sedコマンドは1ファイルにつき1回ずつ実行します。 また、入力ファイル名(in-file)と出力するファイル名(out-file)は 同じにしてはいけません。従って、テンポラリファイルをいったん 生成してから、mvコマンドでファイル名を修正する必要があります。 これをふまえて、forループを使って全ファイルをsedコマンドに かけるようにします。

wdwdwd
質問者

お礼

早速のご返信有り難うございました。 ただ、sedコマンドのように、1ファイルづつの処理では、今回のケースでは対処できないと思いました。 一括で、対象となるファイルを検索して、置換する方法をお聞きしたかったのです。 また、機会がありましたら、宜しくお願い致します。

wdwdwd
質問者

補足

上記の件、私の理解不足のようでした。 sedコマンドをforループで一気に適用するのですね。 forループというのを使用したことがなかったのですが、Yeti21さんの回答を見て、なんとなくイメージできました。 失礼しました。

関連するQ&A

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

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

  • ディレクトリ内の複数のテキストファイルの文字列を、一括置換する方法について

    ディレクトリ内にある複数のcgiファイルの文字列を一括で置換する方法について教えてください。 置換前文字列 jcode.pl ↓ 置換後文字列 ../../jcode.pl 対象ファイル 以下のように、/cgiディレクトリ内に複数のcgiファイルがあります。 /web └/cgi --└ 01.cgi --└ 02.cgi --└ 03.cgi --└ 04.cgi --└ 05.cgi ただし、所有者とパーミッションを変更せずにしたいのです。 sedコマンドを試しましたが、オプションについてよくわからないため、上手く行きませんでした。 (所有者がrootに変更となったり、また、別ファイル名で保存しないと、上手く行きませんでした。) どなたか、ご指南宜しくお願い致します。

  • [Linux] ubuntuでコマンド中の文字列を置換して実行する。

    bashを利用しております。 #mv /abc /abc0 && mv /abc2 /abc 上記コマンドを実行した後、abcという文字列をxyzに置換 (内容的には#mv /xyz /xyz0 && mv /xyz2 /xyzと同一)し、 コマンドを手動で実行する方法を探しています。 ヒストリ置換を用いて 「直前に実行したコマンドのabcという文字列をxyzという文字列に置換して実行する」 にはどのようにすればいいのでしょうか? また、もっといい方法がございましたら、 教えていただけますでしょうか? よろしくお願いいたします。

  • ファイルを開かずにテキストファイルの文字列置換

    続けての投稿で申し訳ないのですが、複数のフォルダ中のテキストファイルすべての中身を検索してある文字列を置換する方法を教えてください。 行いたい作業例ですが、 1)ABC- → ABC-   ある特定の半角文字列+"-"を全角に変換 2)2ー → 2-      ある特定の文字列+"ー(全角の長音)"を文字列+"-(全角のマイナス)"に 3)192.168.0.?? → ABC0?? にしたいです。 フォルダは複数あるため、一階層上から作業できる方がいいです。 AAAというフォルダ下に先のABCというフォルダ以外にDEFやGHIといったフォルダがあり、その下に001-00.txtや001-01.txtというフォルダがあるということです。 よろしくお願いします。

  • ディレクトリ内より特定の文字列を検索する際に関しまして

    文字列の検索に関して質問させていただきます。 あるファイル内から、 特定の文字列を探す際は、 grepを使用して検索をしています。 また、全体の中からファイル名を探す際なども、 findを使って、 探したりしているわけなんですが、 そうではなくて、 あるディレクトリ内にある 複数のファイル内全てから、 「特定の文字列が含まれているか?」を 探すコマンドってあるのでしょうか? 例えばこんな感じです。 ディレクトリAにファイルが10個あるとします。 この10個のファイルの中のどこかに、 「FOO_HEADER」という文字列が 存在しているか?を確認したいときに、 そう思いました。 今までなら、grepを使って、 1つずつファイル内を探したりしていました。 検索サイトで探してみたのですが、 キーワードが悪いのか、 どうも見つけることが出来ませんでした。 もしご存知の方がいらっしゃいましたら、 アドバイスの程お願い致します。 ■OS:Fedora9 ※ 通常はbashを使用しています。

  • ファイル名に特定の文字列を含むファイルを開きたい

    セルに「abc」という文字列があります。 このセルをダブルクリックすると、特定のフォルダ内にある abcを含むファイル(たとえば090507 abc)を開く というようなことをしたいのですが、どのようにしたらよいでしょうか。 対象セルはA列です。 たとえばA2に「abc」とあれば、A2をダブルクリックすると 特定フォルダ内のabcをファイル名に含むファイルを開く A3に「xyz」とあれば、A3をダブルクリックすると 特定フォルダ内のxyzをファイル名に含むファイルを開く といった具合です。 文字列の指定はダブルクリック以外の方法でも構いません。 知識がないものでどのようにしたらよいかわかりません。 どなたかお詳しい方、どうぞよろしくお願い致します。 (ごく簡単なマクロの知識はあります)

  • テキスト置換ソフトで、特定の文字列が●個出てくるごとに置換できるもの知りませんか?

    以下のような機能をもつ テキストファイルの置換ソフトを探しています。 特定の文字列が●個出てくるごとに、 その●個目の部分だけを置換する機能です。 たとえば、 abc abc abc abc abc abc abc abc という文字列があるとして、 手動ではなく一括で以下のように置換をしたいのです。 abc ABC abc ABC abc ABC abc ABC この例では、abcが2つ登場するごとに、ABCという文字列に置換されていますね。このように特定の文字列(この例ではabc)が●個出てくるごとに、その●個目の部分だけを置換するというような機能を持つ(できれば)フリーソフトなどをご紹介いただければありがたいです。 秀丸エディタなどのテキストエディタでは、おそらくできないと思うのですが、もしできるのであれば、そのやり方を教えていただいても構いません。 よろしくお願いいたします。

  • 複数ファイルの文字列の検索と置換

    複数ファイルの中から文字列を検索し、置換して保存をしたいです。 どのようにしたらいいでしょうか。

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

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

  • 複数ファイルの文字列置換の方法について

    あるディレクトリ内にある全てのテキストファイルの中から、「A」という文字列を「B」に置換したいのですが、秀丸もしくはPerlなどで簡単にできますでしょうか? ご存知の方、教えて下さい。 宜しくお願いします。