You can use the
grep
(
27.2
)
option
-c
to tell you how many occurrences of a pattern appear in a given file, so you can also use it to find files that
don't
contain a pattern (i.e., zero occurrences of the pattern). Let's say you're indexing a
troff
(
43.13
)
document and you want to make a list of files that don't yet contain indexing macros. What you need to find are files with zero occurrences of the string
.XX
. The command:
%grep -c "\.XX" chapter*
might produce the following output:
chapter1:10 chapter2:27 chapter3:19 chapter4:0 chapter5:39 ...
This is all well and good, but suppose you need to check index entries in hundreds of reference pages? Well, just filter grep 's output by piping it through another grep . The above command can be modified as follows:
%grep -c "\.XX" chapter* | grep :0
This results in the following output:
chapter4:0
Using
sed
(
34.24
)
to truncate the
:0
, you can save the output as a list of files. For example, here's a trick for creating a list of files that
don't
contain index macros:
%grep -c "\.XX" * | sed -n s/:0//p > ../not_indexed.list
The
sed -n
command prints only the lines that contain
:0
; it also strips the
:0
from the output so that
../not_indexed.list
contains a list of files, one per line. The
..
pathname (
1.21
)
puts the
not_indexed.list
file into the parent directory - this is one easy way to keep
grep
from searching that file, but may not be worth the bother.
[To edit all files that need index macros added, you could type:
%vi `grep -c "\.XX" * | sed -n s/:0//p`
which is more obvious once you start using backquotes a lot. You can put this into a little script named vgrep with a couple of safety features added:
"$@" |
#!/bin/sh case $# in 0|1) echo "Usage: `basename $0` pattern file [files...]" 1>&2 ;; *) pat="$1"; shift grep -c "$pat" "$@" | sed -n 's/:0$//p' ;; esac |
---|
Then you can type, for example,
vi `vgrep "\.XX" *`
.
-JP
]
-