- ベストアンサー
置換
\beginを<start>に置換するのを、 s/\\begin/<start>/; ・・・・・* と書いているのでが、 \\を<k>と置換するのには、どう書いたらいいのでしょうか。 s/\\/<k>/;と書くと、*における\\まで置換されて 困っています。 よろしくお願いします
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
>変換されずに\\のままのところが残ってしまいます s/\\/<k>/g; か s/\\/<k>/go; でやります。 gオプションは、該当するものを全て置き換えます。 付けない場合、最初に見つかったものを置き換えますので、それで、残るモノがあるのだと思います。 oオプションは、正規表現を毎回評価しない(内部表現にかえる、)ので繰りかえし作業する場合に多少効率がよくなります。
その他の回答 (3)
- leaz024
- ベストアンサー率75% (398/526)
>> s/\\(?!begin)/<k>/ > \begin以外にも\から始まる要素がたくさん > あるときはどうしたらいいのでしょうか。 そのような場合は、それらのパターンを | で区切って並べます。例えば、\begin、\end、\etc でない \ を <k> に置換するには次のようにします。 s/\\(?!begin|end|etc)/<k>/ ただし、この方法はあまり効率がよくないので、他の置換を先に行い、最後に \ → <k> の置換をする方がよいでしょう。 > うまく<k>に変換されるのと、変換されずに\\のままのところが残ってしまいます。どうしたらうまくいくでしょうか。 置換オプションに g を指定してみてください。g は global の意味で、マッチするパターンを全て置換します。 これを指定しない場合、最初に見つけたパターンだけしか置換されません。 s/\\/<k>/g ※もしこれでもダメな場合は、再現するスクリプトを提示してください。
お礼
うまくいきました!どうもありがとうございます。 >s/\\(?!begin|end|etc)/<k>/ に書くのですね。勉強になりました。 >ただし、この方法はあまり効率がよくないので・・・ はい。最後に置換することに致しました。 本当に助かりました。感謝致します。
- leaz024
- ベストアンサー率75% (398/526)
No.1さんの回答でOKだと思いますが、もし何らかの理由で*より先に s/\\/<k>/ をしなければならない場合、次のようにすることで \begin を置換対象から外すことができます。 s/\\(?!begin)/<k>/ この「/パターン1(?!パターン2)/」というのは、直後にパターン2がないパターン1にマッチする正規表現です。
お礼
早速の回答、ありがとうございます。 このような書き方もあるのですね。すごいです…。 勉強になります。 >s/\\(?!begin)/<k>/ \begin以外にも\から始まる要素がたくさん あるときはどうしたらいいのでしょうか。 実は、書いてるプログラムは、 s/\\begin/<start>/; ・・・・・* のほかにもs/\\○×□/<△☆>/; というのが何行かありまして、 最後にs/\\/<k>/;をしてみました。 あるテキストファイルを読み込んで、このプログラムで変換しようとしているのですが、そのテキスト中には、\\がところどころにあって、上記のような変換のプログラムでやってみると、うまく<k>に変換されるのと、変換されずに\\のままのところが残ってしまいます。どうしたらうまくいくでしょうか。
- BLUEPIXY
- ベストアンサー率50% (3003/5914)
*を実施した後で 実施する
お礼
早速の回答、ありがとうございます。 実際に書いてるプログラムは、 s/\\begin/<start>/; ・・・・・* のほかにもs/\\○×□/<△☆>/; というのが何行かありまして、 最後にs/\\/<k>/;をしてみました。 あるテキストファイルを読み込んで、このプログラムで変換しようとしているのですが、そのテキスト中には、\\がところどころにあって、上記のような変換のプログラムでやってみると、うまく<k>に変換されるのと、変換されずに\\のままのところが残ってしまいます。どうしたらうまくいくでしょうか。
お礼
うまくいきました! どうもありがとうございました。 本当に助かりました!感謝致します。