Subject: Re: bug#24858: URGENT: Question about grep
From: Eric Blake <[email-masked]>
To: Greta <[email-masked]>, [email-masked]
Date: Wed, 2 Nov 2016 10:49:30 -0500
List-Id: <debbugs-submit.debbugs.gnu.org>

tag 24858 notabug
thanks

On 11/02/2016 09:53 AM, Greta wrote:

> String to search: GTGTCA
> 
> File:
> 
>>HWI-ST740:1:C2GCJACXX:1:1101:1279:1825 1:N:0:
> _/NGACGCTCTGACCTTGGGGCTGGTCGGGG/__A_TGCTGAGGAGACGGTGACCAGGGTTCCCTGGCCCCACANNNCCAAGCTTCCNNNNNNNNNNNNNNNNNNN
> 
>>HWI-ST740:1:C2GCJACXX:1:1101:1349:1847 1:N:0:
> _/NTTAGATGAGGGAAACATCTGCATCAAGTT/__G_TTTATCTGTGACAACAAGTGTTGTTCCACTGCCAAAGAGTTTCTTATAATAAAACAATCGGGGTGGCACNNNNN
> 
> 
> I want that the research is done only in the underline characters.

Underlining doesn't show up in plain text mail (and we prefer plain text
over html bloat on the mailing list).  But I think your point still made
it across

>  So
> what I have to add in grep command to put the limit of 30 characters?

You can't do it with grep.  But you can do it with sed or awk.  Use the
right tool for the job at hand :)

Let's strip your example down to a smaller test case: I want to search
for a one-byte string '1', but only in the first 3 bytes of a file.
With grep, it is not possible; the pattern matches anywhere in the line:

$ printf '012000001\n345000001\n' | grep 1
012000001
345000001

But with sed, we can copy the entire line to hold space, truncate the
line in pattern space, then do the search; if successful, print the line
stored in hold space:

$ printf '012000001\n345000001\n' | \
  sed -n 'h; s/^\(.\{3\}\).*/\1/; /1/ { x;p }'
012000001

And I'll leave the awk program as an exercise for the reader.

Therefore, I'm tagging this as not a bug.

-- 
Eric Blake   eblake redhat com    +1-919-301-3266
Libvirt virtualization library http://libvirt.org