◀ANSI版開発トップへ
  • 3326 ^. 置換(不具合?)
    • 3327 Re:^. 置換(不具合?)
      • 3331 Re2:^. 置換(不具合?)
        • 3332 Re3:^. 置換(不具合?)
          • 3333 Re4:^. 置換(不具合?)
        • 3334 Re3:^. 置換(不具合?)
          • 3336 Re4:^. 置換(不具合?)
            • 3339 Re5:^. 置換(不具合?)
  • [3326] ^. 置換(不具合?) kenji 2003年12月08日 15:21

    ふと気づいたので報告します。

    各行の先頭1文字を削除したかったので、置換で正規表現を使って
    「^.」→「」
    と指定して「すべて置換」したら、全部の文字が消えてしまいました。

    「置換」で1ステップずつ置換してみると、先頭1文字削除した結果に対して
    また先頭1文字削除、というのを繰り返してるみたいです。
    • [3327] Re:^. 置換(不具合?) kenji 2003年12月08日 16:01

      ちょっと気になったんで、手元にあった他のツールでも同じ操作(「^.」→「」)をやってみました。

      全部消える……サクラ, 秀丸(HMJRE&JRE32), Dana, Wz
      先頭1文字だけ消える……sed, ActivePerl, ViVi, WSH5(RegExp.Replace()), BASP21(Replace())
      正しい動作は先頭1文字削除のほうですよね?
      • [3331] Re2:^. 置換(不具合?) かろと 2003年12月11日 00:24

        >タイトル: Re2:^. 置換(不具合?)
        >発言者: kenji
        >ちょっと気になったんで、手元にあった他のツールでも同じ操作(「^.」→「」)をやってみました。
        >
        >全部消える……サクラ, 秀丸(HMJRE&JRE32), Dana, Wz
        >先頭1文字だけ消える……sed, ActivePerl, ViVi, WSH5(RegExp.Replace()), BASP21(Replace())
        >正しい動作は先頭1文字削除のほうですよね?

        かろとです。

        どっちが正しいというのは難しいですねぇ。

        一度ファイルを指定したら、ファイルの最後までユーザに操作させない
        ストリームエディタ系なら、
        ある行に対する行頭置換処理は、1回だけでいいかな?と思いますが、
        (sed, perl, WSH, などは、同じ行で何度も同じ置換をしたければ、その行に同じ操作を行うように書けばいいはず)


        スクリーンエディタのように、置換するごとにユーザに操作を戻す形態だと、
        その行に対して何度も処理するのも、ありかなと思ったりします。


        もし前者のように、先頭の一文字削除しかしない、スクリーンエディタがあって、

        「abcd」
        というテキストがあり、「^.」→「」の置換をすると、
        1回目は
        「bcd」になる。
        で、ユーザに操作が戻って、
        ここで、ユーザがもう一度「^.」→「」の置換をすると、
        「cd」となって欲しいと思う人もいるはずですが、
        先頭の一文字削除した後なので、「bcd」のまま残すのです。

        操作している人の意志がどちらなのか、難しい問題のように思います。

        どうでしょう?
        • [3332] Re3:^. 置換(不具合?) じゅうじ 2003年12月12日 01:30

          ▼ かろとさん
          > 操作している人の意志がどちらなのか、難しい問題のように思います。

          意見です。
          「^.」⇒「a」では1行ずつ進みます。
          「^.」⇒「」では1文字ずつ進みます。
          すべて置換(A)は良いのですが、行頭の ^ + 正規表現が変ですよ。

          例えば、次の2行で、
          aaaab
          aabcd
          「^aa」⇒「a」で先頭から2回置換すると、
          aab
          aabcd
          となっても良いはずですが、成りません。
          • [3333] Re4:^. 置換(不具合?) かろと 2003年12月13日 00:56



            なんでなんだ?って思うのもわかりますので、
            今回は、現在の動作が、なんでそうなるのかを説明しますね。

            >例えば、次の2行で、
            >aaaab
            >aabcd
            >「^aa」⇒「a」で先頭から2回置換すると、
            >aab
            >aabcd
            >となっても良いはずですが、成りません。

            サクラエディタの検索は(多分多くのスクリーンエディタも)、カーソル位置起点に始まるので、
            じゅうじさんの期待通りにならないです。

            以下に説明しますので、
            カーソル位置がどこかに注意を払ってみてください。
            (下記の例では、I でカーソル位置を表します)

            まず、カーソル位置は、行頭にあります。
            Iaaaab
            aabcd

            1回目の「^aa」⇒「a」で置換すると、カーソルが行頭にあるので、
            行頭の「aa」が「a」に置換されて、カーソルは置換された「a」の後にきます。
            (この「a」の後ろにくるってのがミソなのですが、これも恐らく自然な動作だと思います)
            aIaab
            a abcd

            ここで、
            2回目の「^aa」⇒「a」で置換しようとしますが、カーソル位置が行頭にないので、
            「^aa」(=行頭から2文字のa)は、マッチしません。
            したがって、次の行頭の2文字のaにマッチし、置換する動作となります。


            これをふまえて、

            >意見です。
            >「^.」⇒「a」では1行ずつ進みます。
            >「^.」⇒「」では1文字ずつ進みます。
            >すべて置換(A)は良いのですが、行頭の ^ + 正規表現が変ですよ。

            上の例のように、

            >「^.」⇒「a」では1行ずつ進みます。
            の場合は、「a」に置換された後「a」の後ろにカーソル位置がくるため、2回目の置換は次の行になり
            1行ずつ進みます。

            >「^.」⇒「」では1文字ずつ進みます。
            の場合は、「」に置換された後「」の後ろにカーソル位置がきて、これが行頭であるため、
            2回目の置換は、再度この行で行われます。

            現在の動作はこのようになっております。

            現状は、こんな感じになっていて、これでいいのか?というと、
            実は私も整理できてないのです・・・(--;
        • [3334] Re3:^. 置換(不具合?) じゅうじ 2003年12月13日 23:22

          ▼ かろとさん
          そうですか、間違えました。

          行頭の ^ を置換した後、次の行に進まないのですか?
          すべて置換(A)に問題が有りそうですね。

          ちなみに、会社の ex エディター(ViVi)では、
          s/^.//g
          で、先頭の1文字だけが消えました。(^_^)
          • [3336] Re4:^. 置換(不具合?) かろと 2003年12月14日 20:54

            >タイトル: Re4:^. 置換(不具合?)
            >発言者: じゅうじ
            >▼ かろとさん
            >そうですか、間違えました。

            いえいえ、間違えてはいないですよ。
            私はあくまで、現状を説明しただけですから。

            >行頭の ^ を置換した後、次の行に進まないのですか?
            >すべて置換(A)に問題が有りそうですね。

            これは、すべて置換側の動作だけ変えた方がいいという意味でしょうか?
            つまり、毎回「置換」ボタンを押すなら、次の行に進まず、全部の文字が消えて、
            「すべて置換」ボタンを押せば、次の行に進んで、先頭の文字だけが消える。
            という動作になって欲しいと?


            >ちなみに、会社の ex エディター(ViVi)では、
            >s/^.//g
            >で、先頭の1文字だけが消えました。(^_^)

            kenjiさんの報告にあるように、エディタ毎に、この扱いは異なるようです。

            どちらの動作が良いのかは、他のみなさんの意見も聞きたいところです。
            • [3339] Re5:^. 置換(不具合?) じゅうじ 2003年12月15日 22:29

              ▼ かろとさん
              > これは、すべて置換側の動作だけ変えた方がいいという意味でしょうか?
              > つまり、毎回「置換」ボタンを押すなら、次の行に進まず、全部の文字が消えて、
              > 「すべて置換」ボタンを押せば、次の行に進んで、先頭の文字だけが消える。
              > という動作になって欲しいと?

              有難うございます。

              はい、おっしゃるとおりです。「^.」⇒「」の場合、
              1行だけ選択して、すべて置換(A)の場合でも、先頭の1文字だけを削除出来るのが良いですね。
              但し、繰り返し、置換(R)が押された場合はすべて置換(A)とは、違う結果になると思います。