• ベストアンサー

正規表現で置換

正規表現の初心者です。 テキストエディタを使って、「@:」で始まる以外の行の先頭に「//」を挿入してコメントアウトしたいのですが、正規表現がうまく書けません。 検索対象: ^[^(@:)] 置換文字列: // でいいのかなと思ったのですが、[]の中ではグルーピング用の()も文字として認識されてしまうのですね。 どのように書いたら正しく置換されるでしょうか。 どうかご教示ください。

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

  • ベストアンサー
noname#194317
noname#194317
回答No.1

一回でやろうと考えない方が無難な気がします。一番確実なのは、まず全ての行頭に//を追加して、次に//@:を@:に置換することじゃないでしょうか? というのは、うまくマッチさせる正規表現を書けたとしても、「行頭+パターン」の形になるため、パターンにあたる行頭の1文字が//に置換されてしまう結果になるんじゃないかと心配なので。 なお、エディタの種類によっては、行頭に置換をかけると永遠に置換し続けてしまう物もありうるので、注意してください。

Kazu_creator
質問者

補足

早速のご回答ありがとうございます。この件に関しては、2回に分けての作業で対応できそうです。 ところで、「@:」で始まる行とその次の行以外に「//」を付加してコメントアウトするにはどうしたらいいのでしょうか。 ----------------------------- コメントアウト @:インデックス この行はコメントアウトしない コメントアウト ----------------------------- となっている場合に、コメントアウトの行だけ「//」を付けたいのです。

その他の回答 (2)

noname#194317
noname#194317
回答No.3

実行方法も一応書いてあったので気にしてなかったんですが、コマンドを触り慣れていない人には解りにくかったですかね… まず、先のスクリプトを実行するためには、awk本体を入手する必要があります。とりあえずベクターのダウンロード先を参考URLに…って書いたものの、OSはWindowsですよね?以下の話は、基本Windowsとして見てください。 インストールですが、安直には本体(gawk.exe)とスクリプトと加工したいファイルを、全部一つのフォルダに放り込んでしまえばいいです。コマンドを叩くので、あまり深いサブフォルダに作るとめんどくさいため、C:\testみたいな浅い階層がお勧めです。その上で、コマンドプロンプトを開いて次のように実行します。 cd c:\test gawk -f 今回付けた適当なファイル名.awk 加工元ファイル名 > 出力先ファイル名 ここで注意がふたつ。まず、gawk -fの-fは、必ず小文字でなければなりません。-Fでは違う意味になってしまい、うまくいかなくなります。他の部分は大文字小文字はどっちでもいいです。もう一つは、加工元ファイル名と出力先ファイル名は、必ず別々にしてください。同じにすると、悲しい結末が待っています。 これで試してください。

参考URL:
http://www.vector.co.jp/soft/win95/util/se015007.html
Kazu_creator
質問者

お礼

ご親切にどうもありがとうございます。こちらの方法は明日出社してから試してみます。フローが確立されたら自分以外の人間も同じ作業をすることになるので、新規インストールが必要な手順でもよいか聞いてみます。

noname#194317
noname#194317
回答No.2

複数の行を対象にする場合は、正規表現だけでは無理です。awkやperlなどの、テキスト処理に強いスクリプト言語が必要では?ちなみに、awkだと次のような感じのスクリプトになります。これをコピペして適当なファイル名.awkとして保存し、実行します。awkの詳細は、参考URLをどうぞ。なお、インデントはここのシステムが半角スペースを勝手に消してしまうため、それを回避するために全角で入れています。実際に使う場合は、半角スペースに置換してください。 # @:とその次の行以外をコメントアウトする {   if($0 ~/^@:/){     print     getline     print     next   }   print "// " $0 }

参考URL:
http://lagendra.s.kanazawa-u.ac.jp/ogurisu/manuals/awk/intro/
Kazu_creator
質問者

補足

たびたびのご回答、誠にありがとうございます。私もいずれはスクリプト言語の1つくらいは使えるようになりたいと思っています。 ところで、非常に基本的なことで恐縮なのですが、 >適当なファイル名.awkとして保存し、実行します。 「.awk」で保存はしたのですが、実行の仕方がわかりません。 添付してくださったAWKの開設サイトにもここまで基本的なことは書いていないようです。 恥ずかしながら、よろしくお願いします。

関連するQ&A

  • 正規表現を教えて下さい(テキストエディタでの置換)

    いつもお世話になっております。 正規表現に関して細かい質問をさせて下さい。 例えば、G-01,T-02,F-05とあったときに、 これを、01,02,05としたいとき、 正規表現の置換で「[A-Z]-[0-9][0-9]」→「[0-9][0-9]」とすると、 "[0-9][0-9]"という文字列だけ残ってしまいます。 既存の文字列をそのまま残すにはどのようにしたらよいでしょうか? ※テキストエディタでの置換に関してです。 宜しくお願い致します。

    • ベストアンサー
    • PHP
  • テキストエディタでの置換(正規表現チェック済)と同様のことを

    テキストエディタでの置換(正規表現チェック済)と同様のことを エクセルのマクロでもしたい。 画像を添付しましたが、秀丸で置換を選択し、 検索文字列と置換文字列を入れて、正規表現チェックのチェックボックスを 選択した状態で実行するのと同様のことをエクセルのマクロで行いたいです。 正規表現混みだととても難しいです。 やりたいことはマクロで、フォルダ内のテキストファイルを置換をかけていきたいです。(テキストファイルは複数ある状態)そのテキストファイルを更新できればいいです。(別テキストで出力されてもいいです。) どなたか詳しい方、教えていただけませんでしょうか? よろしくお願いいたします。 --- 検索エディタ【秀丸】【置換】 検索【.*item1=(.*) item2=(.*) .*】 置換【\1\t\2】 正規表現チェック

  • 正規表現で一括置換

    現在、数多くの長文データを、テキストエディタの置換機能で一括置換しています。 jeditX(または秀丸エディタ)の正規表現をもちいた複数一括置換について質問させていただきます。 私は正規表現やPC言語の初心者です。どうぞよろしくお願いいたします。 かなり困り果てております。どうぞ、正規表現にくわしいかた、よろしくお願いします。 一二三『一二三にそれぞれ♪マーク』 という文章に対して 一♪二♪三♪ という一括置換をすることには成功しました。 こう書いています。 ■検索文字列 (.{1,1})(.{1,1})(.{1,1})『(.{1,1})(.{1,1})(.{1,1})にそれぞれ♪マーク』 ■置換文字列 \1♪\2♪\3♪ これでぶじ、以下のように一括置換できました。 一♪二♪三♪ 現実には傍点や圏点をふっているんですが、判りやすく♪マークにしています。 この調子で長い文章も変換できていて満足していたのですが…… しかし代入文字が10個以上になったとたんに、まったく動きません。 ■置換したい文章 一二三四五六七八九十『一二三四五六七八九十にそれぞれ♪マーク』 ■検索文字列 (.{1,1})(.{1,1})(.{1,1})(.{1,1})(.{1,1})(.{1,1})(.{1,1})(.{1,1})(.{1,1})(.{1,1})『(.{1,1})(.{1,1})(.{1,1})(.{1,1})(.{1,1})(.{1,1})(.{1,1})(.{1,1})(.{1,1})(.{1,1})にそれぞれ♪マーク』 ■置換文字列 \1♪\2♪\3♪\4♪\5♪\6♪\7♪\8♪\9♪\10♪ こうやると、置換後の文章は以下のようになってしまいます。 一♪二♪三♪四♪五♪六♪七♪八♪九♪一0♪ 10個目以降の数字が、正しく機能してくれません。 \10  という正規表現の書き方は 「一番目の値を参照して、それから数字の0を記入しなさい」 という意味になってしまうようです。 わたしは十番目の値を代入してほしいだけなんです。 \1 や \2 や \3 といった代入文字のように \10 や \11 を機能させる、正しい表記をご教授ください。よろしくお願いいたします。 ちなみに以下のように書いてもダメでした……。 \1\0 グーグルで1日中検索しても判りませんでした。jeditXの複数一括置換でこれをなんとかしたいのです。ご存じの方、どうぞ教えてください。よろしくおねがいします! 秀丸エディタをご利用で、正規表現にくわしい方も、ぜひヒントを出していただければと思います。

  • 正規表現置換

    はじめまして。 現在、テキストエディタで kami987koroです。(漢字、かな、英数字、半角記号、全角記号、改行、スペースを含む文字列)ありがとうございました。 という文字列を正規表現で拾いだして、置換したいと考えています。 ただ、私がその方面の知識に疎く、どう表記すればよいのか分かりません。 そこで、この分野にお詳しい方、ご教授願えませんでしょうか? よろしくお願い致します。

  • 秀丸での正規表現を使用した置換

    いつもお世話になっております。 秀丸で正規表現を使用した置換処理を行いたいと思うのですが、どうしても正規表現の式が書けません。 どうかご教示下さい。 <置換前> ABC1 あAbCd++ ... ... ・先頭4文字は半角英数字の大文字固定 ・その後ろにタブ ・最後にかな、英数字、記号などの可変長の文字列 上記で1レコードです。 <置換後> ABC1 String 内容 あAbCd++ ... ... ・先頭4文字そのまま ・その後ろにタブを3つ+改行 ・続いて「内容」という文字列+改行 ・最後に可変長の文字列をそのまま+改行 「置換」の正規表現は以下だと思うのですが、英数字4文字と可変長文字列を別々にマッチさせる「検索」がどうしても分かりません。 \0 String\n内容\n\1\n どうかご教示下さい。 <環境> Ver.6.1.4

  • 正規表現、置換について

    ファイルから読み込んだ行データを置換したいのですが どういう正規表現にすればよいかご教示下さい。 【置換対象】 testをXXXにしたい ただし、文字列中の後方一つ目のみを置換したい。 【データ】 c:/test/ctestab → c:/test/cXXXab c:/testctest → c:/testcXXX c:/testtesta → c:/testXXXa c:/testtest → c:/testXXX c:/test → c:/XXX

  • 正規表現

    テキストファイルからコメント行以外から文字列"bbb"を含む 行をgrepで抽出したいと思っております。 コメント行→"#"で始まる行と"--"で始まる行 先頭にスペースがある場合もあるので、結局 先頭に「0個以上のスペース+("#"or"--")」がある行は対象外 として、文字列"bbb"を含む行をgrepで抽出したいと思っています。 下記、foo.txtの中から下記の抽出対象の2行のみを抽出したい場合、 どういった正規表現を書けばいいか教えてください。 【foo.txt】 aaa bbb → 抽出対象 aaa bbb →抽出対象 # aaa # bbb →抽出対象外 #aaa # aaa --aaa --aaa -- aaa -- bbb →抽出対象外 -aaa -bbb - aaa ご存じの方がいらっしゃいましたら、よろしくお願い致します。

  • 正規表現でマッチさせたい文字列の指定方法

    正規表現でマッチさせたい文字列の指定方法について こんにちは。正規表現について教えてください。 秀丸エディタでgrepする時に先頭行に 『ファイル名(行数): 』という文字列が 先頭行に入りますが、これを正規表現を使用して消したいと思っています。 具体的には以下のような表現ですが、どのように指定するのが正しいでしょうか。 いくらかテストしているのですが、なかなかうまくできず困っています。 消したい文字列 test.log-110411-01.bak.text(38): よろしくお願いします

  • Perl正規表現(置換)

    Perlを用いてテキスト中の文字列 /^\d+$|^\d+\.[05]{1}$/ を、以下の文字列に置換したい場合、 うまくやる方法はないでしょうか? /^[0]+$|^[0]+\.[0]+$/ 正規表現を使いたいですが、 1つ1つエスケープしていくのはさすがに・・・ よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • 正規表現で全角数字を半角数字に置換する方法は?

    いつもお世話になっております。 テキスト内の全角数字5桁のみを該当の半角数字5桁に置換する方法を探しています。 OS:Win テキストエディタ:sakuraエディタ、秀丸 例) ---------------------------------------- あいうえお01234かきくけこ99さしすせそ ↓ あいうえお01234かきくけこ99さしすせそ ---------------------------------------- 正規表現で行えばいいと思い、置換文字列を  [0-9][0-9][0-9][0-9][0-9] あるいは  [0-9]{5} にしましたが、置換後の文字列が分かりません。 試しに検索で上記の文字列を試すと、該当箇所がマークされるので、 置換前の文字列は合っています。 置換後の文字列をご教授願えますでしょうか。 ※テキストエディタで無理ならプログラム組みます。 VBScriptを考えていますが、他に良い言語があれば併せて教えてください。