Monday, November 1, 2010

Re: delete only the short sentences

Reply to message «Re: delete only the short sentences»,
sent 17:21:40 01 November 2010, Monday
by Tim Chase:

> On 11/01/10 07:40, Joan Miquel Torres Rigo wrote:
> > 2010/11/1 Tim Chase<vim@tim.thechases.com>:
> >> :v/\%40c./d
> >>
> >> ("if there's a character at position 40, don't delete this
> >> row; otherwise, delete it")
> >
> > Then you will also remove rows with 61 to 80 characters.
> >
> > But the strategy is probably good. (I'm not fully expert with
> > vim's regular expressions yet and I don't know the meaning of
> > '%' in this context).
>
> Actually, the problem is the reverse -- it fails to delete lines
>
> > 80 characters. The \%40c is an atom that matches at column 40
> >
> :help /\%c
>
> so any line that doesn't have a character at position 40 (lines
> <40 chars) will be deleted. (note that I don't anchor the
> column-position to the end-of-line) I'd usually[1] do this as a
>
> 2-pass, taking out those >80 in the 2nd pass:
> :v/\%40c./d " delete anything shorter than 40
> :g/\%81c./d " delete anything longer than 80
>
> I might have some fence-posting errors in there, so 40 might need
> to be 39 or 41 and 81 might also be +/- 1, but the logic still holds.
>
> -tim
>
>
> [1]
> Yes, I've had to do the same thing as the OP on several occasions
> with various shorter/longer-than thresholds; usually in
> column-delimited files with garbage before/after the actual data.

s/character/byte/
\%c does nothing with characters, it operates on byte columns. You should use
\%v for displayed columns (unless you have a tab or non-printable character
somewhere before Nth character, \%Nv will match at Nth character).

No comments: