- ベストアンサー
Telnetコマンド/ディレクトリ内の複数ファイルの中から特定の文字列を置換したい
TelnetでLinuxにログインしています。 ディレクトリ内の複数ファイルの中から特定の文字列を置換したいのですが、その方法(コマンド)がわかりません。 例えば、/webディレクトリ内にある全ファイルの中から、「abc」という文字列を見つけて、それを「xyz」に置換したいのです。 どうぞ、ご指南の程、宜しくお願い致します。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
こんな感じでしょうか? cd /web for name in `ls *.txt`;do sed -i s/abc/xyz/g $name;done .txt拡張子のファイル全て 「abc」を「xyz」に置換え
その他の回答 (6)
>shift_jisのHTMLファイルの場合、日本語を置き換えすると、文字化け シェルがEUCで動いてるからじゃ? 間に iconv 挟んでみるとか
- Yeti21
- ベストアンサー率47% (396/830)
申し訳ありません。 サブディレクトリに日本語となると、簡単な方法はちょっと思いつきません。
- Yeti21
- ベストアンサー率47% (396/830)
何度もすみません。 誤字です。 置き返されます→置き換えされます ちなみに、perlの方はforループは不要です。 No.4の例で*.txtで複数ファイル指定になります。 cd /webの後に実行してみてください。
お礼
ご返信有難うございます。 早速、試してみました。 なるほど、確かに置換ができました!助かりました。 ただし、以下の2つ想定外のことが起きました。 1つ目は、/web以下のサブディレクトリにあるファイルが置換できないことです。 2つ目は、shift_jisのHTMLファイルの場合、日本語を置き換えすると、文字化けしてしまうことです。 もし、対処法があればの話しですが、おわかりであれば、ご指南いただけると勉強になります。
- Yeti21
- ベストアンサー率47% (396/830)
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)
補足ですが、 sedで-iを指定するとインプレース、つまり直接置換えを行います。 そうでなければ、元ファイルは更新せず、置き換えた結果を別途 出力するという指定になります。
お礼
早速のご返信ありがとうございました。 コマンドを直接ご記載頂いたので、慣れていない私にとって大変助かります。 さて、教えて頂いたとおりに、打ち込んでみましたが、エラーが発生して、処理ができていないようでした。 何か誤っているのでしょうか。。 [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)
これは下記のようにsedコマンドを使えば可能です。 sed s/abc/xyz/g < in-file > out-file sedコマンドは1ファイルにつき1回ずつ実行します。 また、入力ファイル名(in-file)と出力するファイル名(out-file)は 同じにしてはいけません。従って、テンポラリファイルをいったん 生成してから、mvコマンドでファイル名を修正する必要があります。 これをふまえて、forループを使って全ファイルをsedコマンドに かけるようにします。
お礼
早速のご返信有り難うございました。 ただ、sedコマンドのように、1ファイルづつの処理では、今回のケースでは対処できないと思いました。 一括で、対象となるファイルを検索して、置換する方法をお聞きしたかったのです。 また、機会がありましたら、宜しくお願い致します。
補足
上記の件、私の理解不足のようでした。 sedコマンドをforループで一気に適用するのですね。 forループというのを使用したことがなかったのですが、Yeti21さんの回答を見て、なんとなくイメージできました。 失礼しました。
お礼
いえいえ、大変参考になりました。