• ベストアンサー

マッチ以外を置換について

test.txtのファイルの中に以下のコメントがはいっています。 --- test.txt(置換前) 各URLは以下の通りです。 (1)hoge.com (2)hoge123.com (3)hoge222.com --- ファイルの中のhoge.comはそのままで、以下のようにその他の文字は他の文字に置換を行いたいと思ってます。 --- test.txt(置換後) 各URLは以下の通りです。 (1)hoge.com (2)abc.com (3)abc.com --- 指定した文字(hoge.com)を置換する方法は簡単に行えるのですが、指定した文字以外の文字を置換する場合、どのように書けばいいでしょうか? どなたかよろしくお願いします。

  • hana43
  • お礼率49% (105/212)
  • Perl
  • 回答数4
  • ありがとう数1

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

  • ベストアンサー
  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.4

そうか, シンプルに s///eg でいいんだ. e の存在を忘れてた.... 「URL を表す正規表現」を $url_regex とすると s/$url_regex/index($&, 'hoge.com') == -1 ? 'abc.com' : $&/eg; とか.

hana43
質問者

お礼

ありがとうございます! "e"オプションってありましたね…。 確かにこれを使っていけそうです☆ 大きなヒントをいただきありがとうございました。

その他の回答 (3)

  • ORUKA1951
  • ベストアンサー率45% (5062/11036)
回答No.3

 Tacosanが言われるように、まずURL部分の判別が必要です。そうしないと改行コードや"各URLは以下の通りです。"の部分まで該当してしまいます。  ⇒( http://jbpe.tripod.com/rfcj/rfc2396.ej.sjis.txt ) URL(URI)の規格が掲載されています。具体的には  ⇒URI(URL) の正規表現( http://www.din.or.jp/~ohzaki/perl.htm#URI ) その上で、指定されたもの以外を置換します。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.2

そもそも「URL かどうか」をどう判定するかって問題が残る (「URL」という文字列は URL か?) のだが, そこをクリアできれば「split→置換」とか「否定先読み」とかの方法がとれそう.

hana43
質問者

補足

確かに今回はドメインのみの明記の為、URLかどうかの判断は別として、今回は判別出来た場合において、否定先読みの書き方とか簡単にでいいので教えていただけないでしょうか? ググッてみたのですが、初めて聞いた事なので、どうも理解しにくくうまく書けませんでした。 よろしくお願いします。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.1

具体的にどう置換したいのかよくわからんのだけど, 素直に「マッチしなかったら置換」って書けばいいんじゃないの? 単純には unless (/^hoge\.com$/) { なんか } みたいな感じ.

hana43
質問者

補足

私の書き方が分かりにくくすいません。 ちょっと書き方を変えて、簡単に説明させていただくと、特定のURL以外は他の文字に変更したいと思っております。 変更前 $hoge="各URLは以下の通りです。<br>(1)hoge.com(2)hoge123.com(3)hoge222.com"; $hogeの中のhoge.comはそのままで、それ以外のhoge123.comとhoge222.comを例えばabc.comに変更したいのです。 変更後 $hoge="各URLは以下の通りです。<br>(1)hoge.com(2)abc.com(3)abc.com"; まだ分かりにくいかもしれませんが、よろしくお願いします。

関連するQ&A

  • 置換コマンド

    freeBSD5.3を使用している初心者です。 あるディレクトリ以下の全ファイルに対し、一度に内容の文字を置換したいのですがうまくいきません。 例えば /hoge/aaa.txt /hoge/bbb.txt /hoge/ccc.txt と、/hoge以下に3ファイルがあり、このファイルにAAAという文字列があるなら、AAAをBBBにしたいと思っています。 sed s/AAA/BBB/g /hoge/* とすると、置換後の中身が表示はされますが、それに置きかわったファイルは/hoge/以下に保存されていません。(もとのAAAのまま) できたら、/hoge 以下の置換されたファイルを/hoge2以下に同じ名前で保存させたいと思っています。 どなたか是非アドバイスお願いいたします。

  • sedスクリプト 置換

    この度、はじめてsedスクリプトをかいてみようと思っています。 以下の機能を持った置換スクリプトを書きたいのですが、 アドバイスなど頂ければ幸いです。 ・abcディレクトリ内を検索して(サブディレクトリも含む)、test.txtというファイルを探し出す(test.txtは複数あります) ・検索された複数のtext.txtを一括で置換する ↓置換内容 ・test.txtの5行目にある文字列を1からはじまる連番に置換する(test.txtは複数あるので、処理した順に連番をつけていく) イメージが伝わりにくい場合は、どうかご指摘ください。 よろしくお願いします

  • cshの文字列置換

    ヤマトです。 cshでファイル文字列を置換したいのですが、分かりません。 環境はRed Had Linux7.2です。 hoge1.txt の中の 'HIDUKE' という文字列を今日の日付に置換し、 hoge2.txt に出力するようなシェルを作りましたが、正常に動作しません。 ====hoge1.txt(置換前)==== 今日はHIDUKEです。 ====hoge1.txt(置換前)==== 今日は030814です。 ====SAMPLE.sh(一部抜粋)==== set TODAY = `date +"%y%m%d"` sed 's/HIDUKE/$TODAY/g' < hoge1.txt > hoge2.txt 以上のようなシェルを作りました。 結果として、hoge2.txtには出力されるのですが、 「今日は$TODAYです」 となってしまいます。 変数の値を置換するにはどのようにしたら良いのでしょうか? 教えて頂けると有り難く思います。宜しくお願いします。

  • 変数内のURL文字列を置換させたい

    変数に格納した文字列のうち、URLを以下のようにして 置換しようとしましたが、置換されませんでした。 $html = str_replace("www.sample.com/hoge", "hoge.hogeoge.net", $html); str_replace の使い方が間違っているのでしょうか。 どうぞ宜しくお願い申し上げます。

    • ベストアンサー
    • PHP
  • sedでの改行置換

    sedを用いた処理で質問があります。 出力結果の改行を置換して一列として表示しようとしているのですが、どうもうまくいきません。 (perlは敢えて使いません) 例えば、以下のようなファイルがあるとして、 $ cat hoge.txt hoge boo bar この出力結果を加工して、「hoge boo bar」のように、 改行をスペースに置換して一行として表示したい場合は、どのようにすれば良いでしょうか? ちなみに、以下のような使い方だと、うまくいきませんでした。 $ cat hoge.txt | sed 's/\ > / /g' $ cat hoge.txt | sed 's/\n/ /' ■実行環境 OS : RedHat EL 1 sedのバージョン : sed-4.0.7-3 宜しくお願い致します。

  • UNIX のシェル 文字の置換について

    シェルでファイルの文字列を置換したいです。 /*~*/のコメントの文字なので、1行数を変えたくないです。 ─────────────────────────── ※1文字分の空白を「_」で表示します。 test.txtファイルの「XXXXX」を「aa___」に置換する。 ─────────────────────────── 【test.txt 置換前】 /**************/ /*_XXXXXYYYYY_*/ /**************/ 【シェルの内容 test.sh】 #!/bin/csh set IN_henkan = `printf "%-5s" $1` perl -i -p -e 's/XXX/'$IN_henkan'/g' test.txt 【シェルを実行】 test.sh aa 【test.txt置換前 希望する状態】 /**************/ /*_aa___YYYYY_*/ /**************/ 【test.txt置換前 実際の状態】 /**************/ /*_aa_YYYYY_*/ /**************/ ─────────────────────────── 「aa」の後ろに1文字分の空白しか挿入されないです。

  • エクセルで、ある列に、ある文字列が入力されたら、自動的に置換処理を行うよう設定できるのでしょうか?

    エクセルで、こういうことができるでしょうか? A列(といいますか、どの列でもいいのですが)に、 ある文字列(例えば「abc.com」とします)をコピペで入力すると、 ただちに自動的に、その「abc.com」の文字が「xyz.net」に置換処理されるというような。 ・・・・・・・・・・・・・・ より具体的に言えば、 A列には、他のデータからまとめて何百行ものURLを コピペで入力するという作業をしております。 それらのURLの中には、「abc.com」や「def.biz」や「xyz.net」 など、さまざまなデータが紛れ込むことは避けられません。 作業の目的として、 A列には、絶対に「abc.com」というドメインは入って ほしくないのです。 ですからこれまでは、定期的にA列をまるごと選択して、 その「abc.com」というドメインの文字を「xyz.net」など、別の文字列に置換処理していたのです。 しかし、定期的とはいえ、 1日にかなりの回数の置換操作をするのは面倒なので、 コピペした瞬間に、自動的に自分の望む文字列に置換処理してくれるような設定ができないだろうかと考えたわけです。 エクセルに詳しい方がいましたら、 教えていただけるとありがたいです。 よろしくお願いいたします。

  • ファイル内の文字列を検索して該当行を置換するには?

    C++にて"test.txt"内を検索して"No=00000"という行を"No=12345"に書き換えてファイルを上書き、 という処理をするプログラムを作成したいのですが、どのようにファイルへ書き込みをすればよいのか が分かりません"No=00000"の行を置換するまではできたのですが、置換した文字列で元の文字列を上書きするには どうすれば良いのでしょうか? それとも以下のソースでは根本的に考え方が違うのでしょうか?初歩的な質問で恐縮ですが、よろしく お願い致します。 *************************************** //test.cpp #include <string> #include <fstream.h> void main() { fstream fs; char buf[512]; fs.open("test.txt",ios::in | ios::out); while(!fs.eof()) { fs.getline(buf,sizeof(buf)); if(strstr(buf, "No=")) { std::string aa; aa=buf; aa.replace(3,5,"12345"); //ここからの処理が分かりません・・・ } } } ************************** test.txtは以下の通り Name=test No=00000 ←この行だけ書き換えたい。 Address=hoge

  • C#での文字置換について

    hoge.txt -------------- #abc_1 111111111 222222222 333333333 #abc_2 111111111 222222222 333333333 #abc_3 ... -------------- StreamReader sr = new StreamReader("hoge.txt", Encoding.GetEncoding("UTF-8")); sr.ReadToEnd(); でファイルを読み込み#abc_1から#abc_2の間の 111... 222... 333... というのを削除して 出力したいのですが分かりません。 (同様に#abc_2から#abc_3の間も削除します) つまり出力は #abc_1 #abc_2 #abc_3 となるように。 宜しくお願いします

  • 他フォルダにある同名ファイルを別ファイルに置換

    たとえば、いくつものフォルダ内に、  ABC.txtが存在するのですが、このABC.txtを全てNEW_ABC.txtに丸ごと置換したいのですが、いい方法がわかりません。 ファイル名ではなく、ファイルそのものを置換したいんですが。。。何かいい方法がありましたら教えてください。