On 09/20/10 13:11, Christian Brabandt wrote:
On Mo, 20 Sep 2010, HermannHeilner wrote:
Search a specific pattern A, then search a specific pattern B, then mark the
letters between these two patterns and copy these into a new file.

For example, you search from the current cursor position the beginning
of foobar and want to write until the next baz. You can simply do this:
/^foobar/+,/^baz/-w foobar.txt
This copies the text between the lines to the file foobar.txt If you
want to include the start and end patterns, leave the + and - signs out.

Christian gives a workable solution for a certain line-format, assuming your search-items are on their own lines, and the contents between them are also on their own line(s).

It gets a little trickier when you have them inline:

  aaaacgtaggggggatgca
         ^^^^^^^^

if you want to extract the information between "acgt" and "tgca" (in the above example "agggggga"), you'd have to pull the text in visual mode, and use search-offsets

  :nnoremap <f4> /acgt/e+1<cr>v/tgca/s-1<cr>y:new<cr>P

would map <f4> to

/acgt/e+1    " search for 'acgt' and position the cursor
             " at the end+1 of the match
<cr>         " execute the search
v            " go into character-wise visual mode
/tgca/s-1    " search for 'tgca' and position the cursor
             " at start-1 (the character before the match)
<cr>         " execute the search
y            " yank the resulting text
:new<cr>     " create a new unnamed buffer
P            " paste the yanked text in this new buffer


You can then save this new buffer as you would any other:

  :w /path/to/wherever/extract.txt

It gets a little trickier if you want to have it mapped *and* provide the patterns dynamically, but it can be done:

  :let b:start = "acgt"
  :let b:end = "tgca"
:nnoremap <f4> /<c-r>=b:start<cr>/e+1<cr>v/<c-r>=b:end<cr>/s-1<cr>y:new<cr>P

should come fairly close. That way, you could tweak the values for b:start and b:end and <f4> should Do The Right Thing(tm).

To read up on some of these bits:

  :help /
  :help {offset}
  :help c_CTRL-R_=

Hope this helps,

-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

Reply via email to