views:

295

answers:

1

Windows command line, I want to search a file for all rows starting with:

# NNN "<file>.inc"

where NNN is a number and <file> any string.

I want to use findstr, because I cannot require that the users of the script install ack.

Here is the expression I came up with:

>findstr /r /c:"^# [0-9][0-9]* \"[a-zA-Z0-9_]*.inc" all_pre.txt

The file to search is all_pre.txt.

So far so good. Now I want to pipe that to another command, say for example more.

>findstr /r /c:"^# [0-9][0-9]* \"[a-zA-Z0-9]*.inc" all_pre.txt | more

The result of this is the same output as the previous command, but with the file name as prefix for every row (all_pre.txt).

Then comes:

FINDSTR: cannot open |
FINDSTR: cannot open more

Why doesn't the pipe work?


snip of the content of all_pre.txt

# 1 "main.ss"
# 7 "main.ss"
# 11 "main.ss"
# 52 "main.ss"
# 1 "Build_flags.inc"
# 7 "Build_flags.inc"
# 11 "Build_flags.inc"    
# 20 "Build_flags.inc"
# 45 "Build_flags.inc(function a called from b)"

EDIT: I need to escape the dot in the regex also. Not the issue, but worth to mention.

>findstr /r /c:"^# [0-9][0-9]* \"[a-zA-Z0-9_]*\.inc" all_pre.txt

EDIT after Frank Bollack:

>findstr /r /c:"^# [0-9][0-9]* \"[a-zA-Z0-9_]*\.inc.*" all_pre.txt | more

is not working, although (I think) it should look for the same string as before then any character any number of times. That must include the ", right?

+3  A: 

You are missing a trailing \" in your search pattern.

findstr /r /c:"^# [0-9][0-9]* \"[a-zA-Z0-9]*.inc\"" all_pre.txt | more

The above works for me.

Edit:

findstr /r /c:"^# [0-9][0-9]* \"[a-zA-Z0-9]*\.inc.*\"" all_pre.txt | more

This updated search string will now match these lines from your example:

# 1 "Build_flags.inc"
# 7 "Build_flags.inc"
# 11 "Build_flags.inc"
# 20 "Build_flags.inc"
# 45 "Build_flags.inc(function a called from b)"

Edit:

To circumvent this "bug" in findstr, you can put your search into a batch file like this:

@findstr /r /c:"^# [0-9][0-9]* \"[a-zA-Z0-9_]*\.inc" %1

Name it something like myfindstr.bat and call it like that:

myfinsdtr all_pre.txt | more

You can now use the pipe and redirection operators as usual.

Hope that helps.

Frank Bollack
am I? It does make a difference, but I don't know why. I did not plan to include the closing double-quote in the regex. findstr must also find rows of the form `# 123 "file.inc(other information)"`.
Gauthier
Note also that the `findstr` command without pipe (and without trailing `\"`) does output the correct rows.
Gauthier
@Gauthier: I couldn't find any reference explaining this oddity, but it seams as if `findstr` always expects balanced quotes in the search string.
Frank Bollack
@Frank: I agree with you, and I don't seem to be alone: http://www.serverforumz.com/FINDSTR-search-couble-quote-redirect-pipe-output-ftopict25287.html
Gauthier
Thanks for the updated string. Although it would work in my case, it means that findstr would not work for `# 123 "filefilefile.inc(other info)` without the closing double quote. Somebody should be ashamed.
Gauthier
Thanks for the effort. I don't think I'll be willing to create a batch file everytime I need to search for an unbalanced pair of double quotes. I think I'll try to promote the use of GnuWin32 at work instead.
Gauthier