アプリ版:「スタンプのみでお礼する」機能のリリースについて

TelnetでLinuxにログインしています。
ディレクトリ内の複数ファイルの中から特定の文字列を置換したいのですが、その方法(コマンド)がわかりません。

例えば、/webディレクトリ内にある全ファイルの中から、「abc」という文字列を見つけて、それを「xyz」に置換したいのです。

どうぞ、ご指南の程、宜しくお願い致します。

A 回答 (7件)

こんな感じでしょうか?



cd /web

for name in `ls *.txt`;do sed -i s/abc/xyz/g $name;done

.txt拡張子のファイル全て 「abc」を「xyz」に置換え
    • good
    • 0

>shift_jisのHTMLファイルの場合、日本語を置き換えすると、文字化け


シェルがEUCで動いてるからじゃ?
間に iconv 挟んでみるとか
    • good
    • 0

申し訳ありません。


サブディレクトリに日本語となると、簡単な方法はちょっと思いつきません。
    • good
    • 0
この回答へのお礼

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

お礼日時:2006/10/03 13:24

何度もすみません。


誤字です。

置き返されます→置き換えされます

ちなみに、perlの方はforループは不要です。
No.4の例で*.txtで複数ファイル指定になります。

cd /webの後に実行してみてください。
    • good
    • 0
この回答へのお礼

ご返信有難うございます。

早速、試してみました。
なるほど、確かに置換ができました!助かりました。

ただし、以下の2つ想定外のことが起きました。

1つ目は、/web以下のサブディレクトリにあるファイルが置換できないことです。

2つ目は、shift_jisのHTMLファイルの場合、日本語を置き換えすると、文字化けしてしまうことです。

もし、対処法があればの話しですが、おわかりであれば、ご指南いただけると勉強になります。

お礼日時:2006/10/02 16:31

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と
ファイル名の後ろに拡張子を追加して保存します。

こちらが使えれば簡単なんですが。
    • good
    • 0

補足ですが、



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

早速のご返信ありがとうございました。

コマンドを直接ご記載頂いたので、慣れていない私にとって大変助かります。

さて、教えて頂いたとおりに、打ち込んでみましたが、エラーが発生して、処理ができていないようでした。
何か誤っているのでしょうか。。

[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.
・・・・・・・・・・・・

お礼日時:2006/10/02 13:49

これは下記のようにsedコマンドを使えば可能です。


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

この回答への補足

上記の件、私の理解不足のようでした。

sedコマンドをforループで一気に適用するのですね。

forループというのを使用したことがなかったのですが、Yeti21さんの回答を見て、なんとなくイメージできました。

失礼しました。

補足日時:2006/10/02 12:16
    • good
    • 0
この回答へのお礼

早速のご返信有り難うございました。

ただ、sedコマンドのように、1ファイルづつの処理では、今回のケースでは対処できないと思いました。

一括で、対象となるファイルを検索して、置換する方法をお聞きしたかったのです。

また、機会がありましたら、宜しくお願い致します。

お礼日時:2006/10/02 12:14

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!