home *** CD-ROM | disk | FTP | other *** search
/ Shareware Overload / ShartewareOverload.cdr / games / patterns.zip / FP.DOC < prev    next >
Text File  |  1988-04-03  |  13KB  |  315 lines

  1.  
  2.                              FP.EXE
  3.             Displays Those Lines from a Set of Files
  4.      That Are Matched by a Given Regular Expression Pattern
  5.  
  6.                                by
  7.                        Robert A. Magnuson
  8.                          DMB, DCRT, NIH
  9.                        Bethesda, MD 20892
  10.                             Feb 1988
  11.  
  12.                         Revised Apr 1988
  13.  
  14.  
  15.  
  16. FP (for Find Pattern) is a tool used to search DOS files for
  17. those lines that are matched by a specified pattern.  The found
  18. lines are "printed", i.e., written to stdout.
  19.  
  20.     [This document is intended to be read from the screen.
  21.     It contains some characters which will probably not print
  22.     correctly on a printer.]
  23.  
  24. A DOS command line that invokes FP contains a number of
  25. arguments.  The syntax is summarized by the following diagram:
  26.  
  27.        ┌────────────────┐
  28.        │ options:        │ ┌──────────┐ ┌─ <pattern> ─┐ ┌─────────────┐
  29.    FP ─┴─ / ─┬ <ltr> ┬──┴─┴─ <ufile> ─┴─┤             ├─┴─┬ <file> ┬──┴─
  30.              └──────┘                   └─ <patfile> ─┘   └───────┘
  31.  Option Definitions:
  32.  ───────────────────                    │  Pattern can contain nonzero
  33.  /c  just give count                    │  hexadecimal byte representations
  34.  /e  no more option args even if        │  "\xhh".
  35.      next arg begins with /             │
  36.  /f  pattern in <patfile>               │
  37.  /h  highlight match                    │
  38.  /n  print line nr with line            │
  39.  /o  omit printing filename             │
  40.  /u  unmatched lines written to <ufile> │
  41.  /v  invert match                       │
  42.  /x  compare case exact                 │
  43.  
  44. First there may be option arguments.  Next there may be the
  45. <ufile> name (if the /u option was taken).  Then there is the
  46. required pattern which is used to match the lines taken from the
  47. files whose names follow.  The pattern itself may appear (no /f
  48. option), or the <patfile> names the file containing it (/f
  49. option).  The remaining filenames can be wildcarded.  If no
  50. filenames appear, FP gets its lines from stdin.
  51.  
  52.     The arguments can optionally be enclosed in double
  53.     quotes.  The enclosing quotes are stripped off and not
  54.     seen by FP.  Should you need to have a double quote
  55.     within an argument, the argument must be double quoted
  56.     and the internal double quote must be escaped by
  57.     preceding it with a backslash.  This treatment of the
  58.     double quotes is done by the argc/argv mechanism of the C
  59.     compiler.  [FP is implemented in Borland TurboC.]
  60.  
  61. FP exits with ERRORLEVEL set to one if some lines were matched,
  62. to zero if none were matched, and to two for syntax problems.
  63.  
  64. OPTION ARGUMENTS:
  65.  
  66. FP options are specified by the presence or absence of various
  67. option letters in option arguments.  Any option argument must
  68. begin with a slash and must appear in front of the other kinds of
  69. arguments.  Any number of legal option letters can appear in an
  70. option argument.  Thus, you can have multiple option arguments,
  71. perhaps each with a single option letter (and each beginning with
  72. a slash), or just one option argument containing all of the
  73. option letters desired.  CURRENTLY, ALL LEGAL FP OPTION LETTERS
  74. ARE lower case.
  75.  
  76.     For the sake of readability, the above shown syntax
  77.     diagram shows only the case where all option letters
  78.     appear in one option argument.
  79.  
  80. A FP syntax error occurs when illegal option letters appear, and
  81. when required arguments are missing.  The pattern argument is
  82. required.
  83.  
  84. When a syntax error occurs FP prints a boxed syntax diagram
  85. containing terse instructions on how to use FP.  This mechanism
  86. can be deliberately tripped in order to get on-screen help.  The
  87. suggested way is to invoke FP with no arguments--thus causing
  88. the no-pattern syntax error.
  89.  
  90. FP prints the ordinal line number together with each found line
  91. when the /n option is specified.  Case (upper or lower) is
  92. ignored unless the /x option has been taken.  With the /c option
  93. FP omits printing the found lines, printing instead just the
  94. count of the number of lines found.  The /o option omits printing
  95. the filename(s), is overridden by the /c option.  The /v option
  96. reverses the selection procedure, selecting those lines which are
  97. not matched by the pattern.  The /e option permits the pattern to
  98. start with a slash--otherwise the pattern (with no preceding
  99. <ufile>) would look like another option argument.  The /h option
  100. highlights the matching substrings in each displayed line on the
  101. screen.  The /h option--overridden by the /c and /v
  102. options--should not normally be used if the output is not
  103. intended for the screen.  The /u option extends FP, allowing the
  104. unmatched lines to be copied to a file.
  105.  
  106.     FP.COM uses ANSI.SYS escape sequences for the
  107.     highlighting.  These escape sequences are effective when
  108.     they reach the screen.  Hence, if you redirect the output
  109.     to a file while the /h option is in effect, those escape
  110.     sequences become part of the file.  Later on, if you TYPE
  111.     the file, the highlighting will be done because the
  112.     escape sequences are in the file.  But, if the redirected
  113.     material is intended, say, to be part of a source
  114.     language program, the included escape sequences are not
  115.     what you want there.
  116.  
  117. REGULAR-EXPRESSION PATTERN-MATCHING:
  118.  
  119. FP selects the lines by means of pattern matching.  The <pat> is
  120. a pattern that is matched against each file line.  Case (upper or
  121. lower) is ignored unless the /x option has been taken.
  122.  
  123. A pattern is a string of characters.  We distinguish two kinds of
  124. characters:  normal and meta.  There are exactly nine
  125. metacharacters:
  126.  
  127.         . * + ? ^ $ [ ] \
  128.  
  129. The remaining characters are normal.  Metacharacters sometimes
  130. combine with normal characters as we will see.  Otherwise, a
  131. normal character simply matches itself.  The metacharacters
  132. behave as follows:
  133.  
  134.         A       matches
  135.         ─────   ────────────────────────────
  136.         .       any single byte
  137.         *       0 or more of the preceding
  138.         +       1 or more of the preceding
  139.         ?       0 or 1 of the preceding
  140.         [...]   any 1 of the enclosed bytes
  141.         [^...]  any byte not enclosed
  142.         ^       the beginning of the <cmp>
  143.         $       the end of the <cmp>
  144.         \α      α, where α is a metabyte
  145.         α\!ß    α or ß
  146.         \(α\)   α (grouped for precedence)
  147.         \δ      the δth group where δ is 1-9
  148.         \b      beginning/end of a word
  149.         \<      beginning of a word
  150.         \>      end of a word
  151.         \w      a word byte: [a-zA-Z0-9]
  152.         \W      a nonword byte: [^a-zA-Z0-9]
  153.  
  154. Note that the '\' metacharacter is used as an escape, i.e., to
  155. quote a metacharacter.  Thus to match, e.g., a period (as a
  156. normal character) you must use '\.'  If you leave out the
  157. backslash, the period alone will have its metacharacter meaning.
  158.  
  159. In the above explanation of the '*', '+' and '?' metacharacters,
  160. 'preceding' means 'the shortest possible preceding'.  Thus, 'ab+'
  161. matches 'ab', 'abb', etc., but not 'abab'
  162.  
  163. The square bracket metacharacters specify any one of the enclosed
  164. characters--known as a character class.  The minus sign has a
  165. special meaning as a range in a character class.  '[a-g]' can be
  166. used in place of '[abcdefg]'.  When appearing first in a
  167. character class, a circumflex indicates that the match is with
  168. any character not in the character class.  Thus, '[^0-9]' matches
  169. any non decimal-digit.  Most metacharacters lose their special
  170. status in a character class, and should not be escaped.  If a
  171. right square bracket is to be in a character class, it must
  172. follow immediately the beginning left square bracket.  If a minus
  173. sign is to be in a character class, it must appear as '---',
  174. i.e., a range containing only itself.  Since the square brackets
  175. do not nest, a left square bracket can easily be included in a
  176. character class.  E.g., '[][]' matches a right or a left square
  177. bracket.
  178.  
  179. Some pattern match examples follow:
  180.  
  181.         A                   matches
  182.         ────────────────── ───────────────────────
  183.         zyx                 zyx
  184.         f.x                 fax, fix and fxx
  185.         f\.x                f.x
  186.         f[aix]x             only fax, fix and fxx
  187.         \[[a-z]+\]          [hello] and [world]
  188.         \(suf\!pre\)fix     suffix or prefix
  189.         ba\(na\)*           banananana
  190.         [A-P]:              A:, C:, H:, etc
  191.         \([cd]:\)?\w        abc, c:zyx, d:cat, etc
  192.         \(abra\)\(cad\1\)*  abracadabracadabra
  193.  
  194.  
  195.     Due to a bug in PC DOS I have changed the alternative
  196.     (i.e., the "or") from '\|' to '\!'.  The vertical, '|',
  197.     is DOS's piping symbol.  Although doublequoting is
  198.     supposed to protect any redirection symbols in the
  199.     interior from being acted upon, under certain
  200.     circumstances DOS performs the redirection even though
  201.     it is doublequoted.
  202.  
  203. Please note that FP's pattern matching is done via REGEX.C from
  204. Free Software Foundation, Inc.
  205.  
  206.  
  207. HEXADECIMAL REPRESENTATION IN PATTERN
  208.  
  209. Sometimes it is convenient or necessary to represent bytes in a
  210. coded fashion.  You may need a smiley face, for example.  You can
  211. keyboard this character directly in two ways: (1) by entering a
  212. control-A, or (2) by holding down the ALT key, typing a "1" on
  213. the numeric keyboard, then releasing the ALT key.  But when you
  214. need to document this character on your printer, the smiley face
  215. does not print at all!  Worse yet, if you need to enter a tab on
  216. the DOS command line, DOS may translate it into spaces (up to the
  217. next tab stop).  CHP allows characters to be entered in a
  218. hexadecimal format, either as
  219.  
  220.         /xhh
  221.  
  222. or as
  223.  
  224.         \xh
  225.  
  226. where the h's are hexadecimal digits.  Both the "x" and the A
  227. through F can be upper/lower case (or mixed).
  228.  
  229. EXAMPLES:
  230.  
  231. To search for lines containing 'cat', do an
  232.  
  233.         fp cat alpha.txt
  234.  
  235. This will find lines containing 'cat', irrespective of case, and
  236. regardless of surrounding material.  To find lines containing
  237. 'cat' as a word--and not 'cats', 'cathode', or 'indicate', do an
  238.  
  239.         fp \bcat\b alpha.txt
  240.  
  241. The '\b's say that 'cat' must not butt up against letters or
  242. digits.  To find lines containing 'cat' or 'cats' as words, do an
  243.  
  244.         fp \bcats?\b alpha.txt
  245.  
  246. That pattern may be pronounced as:  wordbreak, 'cat', 0 or 1 's',
  247. wordbreak.
  248.  
  249. To search for empty lines, do an
  250.  
  251.         fp/v . alpha.txt
  252.  
  253. To search for doublequotes, do an
  254.  
  255.         fp/v "\"" alpha.txt
  256.  
  257. The pattern seen by FP in this case is simply one doublequote.
  258. The C compiler's argc-argv handler sees a doublequoted escaped
  259. doublequote.  The outer doublequotes are stripped, and the inner
  260. escaped doublequote becomes a doublequote.  The resultant
  261. doublequote is then given to FP as the second command-line
  262. argument.  [The first argument is '/v'.]
  263.  
  264. Suppose one of your utilities, say FOO, has been revised such
  265. that one of its little used options no longer functions as it
  266. used to.  Now you must search all your batch files for
  267. invocations of FOO.  The following FP will show you all batch
  268. file lines containing 'foo' as a separate word.
  269.  
  270.         fp/n \bfoo\b c:\util\*.bat
  271.  
  272. A second way of searching for batch files containing FOO is to
  273. use the count option.
  274.  
  275.         fp/c \bfoo\b c:\util\*.bat
  276.  
  277. This will print each filename followed by the count of the number
  278. of lines that contain FOO.  If all of the counts all zero, no
  279. action need be taken.  Carrying this one step further, why not
  280. just ask whether all the counts are nonzero?  To do this we pipe
  281. the above FP's output to another FP invocation:
  282.  
  283.         fp/c \bfoo\b c:\util\*.bat | fp/v \b0$
  284.  
  285. where we want to see only those batch files whose FOO count is
  286. not zero.  The second FP's pattern is for '0' as a word that ends
  287. the line.  The /v option gives the cases where the first FP gave
  288. a nonzero count.
  289.  
  290. Suppose you want to see lines in your FOO.C file that contain a
  291. two-byte variable of the form: "a" followed by a digit.  The
  292. following FP will display such lines each with its ordinal line
  293. number and with each match highlighted in reverse video.
  294.  
  295.         fp/nh \ba[0-9]\b foo.c
  296.  
  297. Here's an example of how to get a "combined" directory where the
  298. DIR's output is piped to FP.  Suppose, in a large directory with
  299. many files, you want to see those files with extensions of DOC or
  300. BAT.  In the following line FP searches through stdin (no
  301. filenames in the FP command) for DOC or BAT surrounded by blanks.
  302.  
  303.         dir|fp " doc \! bat "
  304.  
  305. Note that the pattern is doublequoted because of its internal
  306. blanks.  This is an example that failed when using the original
  307. '\|' for the "or".
  308.  
  309. Perhaps you are looking for a filename that you can't remember.
  310. But you think it has a double letter in it. Use the following
  311. where the pattern matches a letter followed by itself.
  312.  
  313.         dir|fp \([A-Z]\)\1
  314.  
  315.