Loading ...
Sorry, an error occurred while loading the content.
 

Re: how can you delete every line between two phrases?

Expand Messages
  • Jiaxing Wang
    ... Hi,tim In :g/how are you?/.;/:-)/d, Is /how are you?/.;/:-)/ the pattern in ... Would you mind explaining this pattern a little? I don t quite
    Message 1 of 8 , Dec 2, 2012
      On Sat 17 Nov 2012 12:00:38 PM CST, Tim Chase wrote:
      > On 11/16/12 21:22, Tony Mechelynck wrote:
      >> The above implements a linewise deletion. For characterwise, you can use
      >>
      >> :%s/how are you?\zs\_.*\ze:-)//e
      >>
      >> Notes:
      >> - If there are several matching pairs, this subsitute will remove from
      >> the first "how are you" to the last ":-)".
      >
      > Which you can then tweak by changing the "*" to "\{-}"
      >
      > If you want to do it line-wise and you have multiple instances in
      > the file, you can do something like
      >
      > :g/how are you?/.;/:-)/d
      >
      > to delete them inclusive, or
      >
      > :g/how are you?/+;/:-)/-d
      >
      > (the "+" bumps the starting line forward one from the match, the "-"
      > bumps it back one line from the ending match).
      >
      > And if you have multiple files to do it across, you can use
      > windo/bufdo/argdo/tabdo to prefix the command (either setting
      > 'hidden' beforehand or writing the file as well)
      >
      > -tim
      >
      >

      Hi,tim
      In :g/how are you?/.;/:-)/d,
      Is '/how are you?/.;/:-)/' the pattern in
      :[range]g[lobal]/{pattern}/[cmd]?
      Would you mind explaining this pattern a little? I don't quite
      understand this, thanks.

      --
      You received this message from the "vim_use" maillist.
      Do not top-post! Type your reply below the text you are replying to.
      For more information, visit http://www.vim.org/maillist.php
    • Tim Chase
      ... Using your template of :[range]global]/{pattern}/[cmd] it breaks down as ... where [cmd] is .;/:-)/d which is a range from the currently matching how
      Message 2 of 8 , Dec 2, 2012
        On 12/02/12 20:15, Jiaxing Wang wrote:
        > In :g/how are you?/.;/:-)/d,
        > Is '/how are you?/.;/:-)/' the pattern in
        > :[range]g[lobal]/{pattern}/[cmd]?
        > Would you mind explaining this pattern a little? I don't quite
        > understand this, thanks.

        Using your template of ":[range]global]/{pattern}/[cmd]" it breaks
        down as

        :g/how are you?/[cmd]

        where [cmd] is

        .;/:-)/d

        which is a range from the currently matching "how are you?" line
        through the next line containing ":-)". The Ex command issued over
        that range is "d"elete. If you read at

        :help :range

        you'll see the "/" is a way of specifying an address. You can even
        stack them if you want, such as

        +3;/hello/?world?+2

        which will start the range 3 lines after the currently matching
        line, and end the range at the location found by searching forwards
        to "hello", then backwards to "world", and then going forwards two
        lines. It's a bit of a crazy example, but sometimes that's exactly
        what you need to specify the range you want. A recent real-world
        example from my own use was something like:

        :g/^\s*def [^(]*[pP]rovider/+1;'}?DEBUG?s/^/#

        which commented out ("s/^/#") the lines in Python code after the
        function definition, through the last DEBUG in the current paragraph
        (as marked by '}).

        The difference between using ";" (as I do) and using "," is one of
        those things I don't fully grasp as it seems to be fairly
        interchangeable in other contexts. But in this use-case as a
        destination for :g commands, I find that I almost always want ";".
        This is tersely documented at

        :help :;

        I hope that helps disassemble my answer so that you can go do crazy
        things with vim and impress your colleagues, too. :-)

        -tim



        --
        You received this message from the "vim_use" maillist.
        Do not top-post! Type your reply below the text you are replying to.
        For more information, visit http://www.vim.org/maillist.php
      • stosss
        ... I looked at :help :range as Tim suggested above. Just want to see if I understand correctly. Does vim do addressing like sed? That seems to be what I see.
        Message 3 of 8 , Dec 2, 2012
          On Sun, Dec 2, 2012 at 9:39 PM, Tim Chase <vim@...> wrote:
          > On 12/02/12 20:15, Jiaxing Wang wrote:
          >> In :g/how are you?/.;/:-)/d,
          >> Is '/how are you?/.;/:-)/' the pattern in
          >> :[range]g[lobal]/{pattern}/[cmd]?
          >> Would you mind explaining this pattern a little? I don't quite
          >> understand this, thanks.
          >
          > Using your template of ":[range]global]/{pattern}/[cmd]" it breaks
          > down as
          >
          > :g/how are you?/[cmd]
          >
          > where [cmd] is
          >
          > .;/:-)/d
          >
          > which is a range from the currently matching "how are you?" line
          > through the next line containing ":-)". The Ex command issued over
          > that range is "d"elete. If you read at
          >
          > :help :range
          >
          > you'll see the "/" is a way of specifying an address. You can even
          > stack them if you want, such as
          >
          > +3;/hello/?world?+2
          >
          > which will start the range 3 lines after the currently matching
          > line, and end the range at the location found by searching forwards
          > to "hello", then backwards to "world", and then going forwards two
          > lines. It's a bit of a crazy example, but sometimes that's exactly
          > what you need to specify the range you want. A recent real-world
          > example from my own use was something like:
          >
          > :g/^\s*def [^(]*[pP]rovider/+1;'}?DEBUG?s/^/#
          >
          > which commented out ("s/^/#") the lines in Python code after the
          > function definition, through the last DEBUG in the current paragraph
          > (as marked by '}).
          >
          > The difference between using ";" (as I do) and using "," is one of
          > those things I don't fully grasp as it seems to be fairly
          > interchangeable in other contexts. But in this use-case as a
          > destination for :g commands, I find that I almost always want ";".
          > This is tersely documented at
          >
          > :help :;
          >
          > I hope that helps disassemble my answer so that you can go do crazy
          > things with vim and impress your colleagues, too. :-)
          >
          > -tim


          I looked at :help :range as Tim suggested above. Just want to see if I
          understand correctly. Does vim do addressing like sed? That seems to
          be what I see.

          --
          You received this message from the "vim_use" maillist.
          Do not top-post! Type your reply below the text you are replying to.
          For more information, visit http://www.vim.org/maillist.php
        • Tim Chase
          ... Yes, only better. Sed has a difficult time going backwards (you have to gather things up in the hold space or in the current buffer). Vim has no problems
          Message 4 of 8 , Dec 2, 2012
            On 12/02/12 20:46, stosss wrote:
            > On Sun, Dec 2, 2012 at 9:39 PM, Tim Chase <vim@...> wrote:
            >> On 12/02/12 20:15, Jiaxing Wang wrote:
            >>> In :g/how are you?/.;/:-)/d,
            >>> Is '/how are you?/.;/:-)/' the pattern in
            >>> :[range]g[lobal]/{pattern}/[cmd]?
            >>> Would you mind explaining this pattern a little? I don't quite
            >>> understand this, thanks.
            >>
            >> [snip my rambling about ranges]
            >
            > I looked at :help :range as Tim suggested above. Just want to see if I
            > understand correctly. Does vim do addressing like sed? That seems to
            > be what I see.

            Yes, only better. Sed has a difficult time going backwards (you
            have to gather things up in the hold space or in the current
            buffer). Vim has no problems marching all over your document, so
            you can use marks, relative & absolute line numbering, searching
            forwards and backwards, or any chain of those you want in any order
            that suits your needs.

            -tim




            --
            You received this message from the "vim_use" maillist.
            Do not top-post! Type your reply below the text you are replying to.
            For more information, visit http://www.vim.org/maillist.php
          Your message has been successfully submitted and would be delivered to recipients shortly.