Date: Fri, 4 Sep 1998 09:53:58 -0500 From: Dan Nelson <dnelson@emsphone.com> To: Roman Katsnelson <romank@graphnet.com>, "q's" <freebsd-questions@FreeBSD.ORG> Subject: Re: grep question Message-ID: <19980904095358.A7658@emsphone.com> In-Reply-To: <35EFEEA4.65B3315F@graphnet.com>; from "Roman Katsnelson" on Fri Sep 4 09:44:04 GMT 1998 References: <35EFEEA4.65B3315F@graphnet.com>
next in thread | previous in thread | raw e-mail | index | archive | help
In the last episode (Sep 04), Roman Katsnelson said:
> I have one text file with many records. Each record is 16 lines long.
> The record's identifier is always the third line because it's unique.
> The records look like this:
>
> <blank line>
> ##################################
> # --->uniquerecordname
> ##################################
> recorddata 12 more lines worth.
>
> I am writing a script which will automate deleting the records. Here's
> what I've done:
>
> grep -e "uniquerecordname" -A 13 -B 2 #this yields the record correctly.
>
> however,
>
> grep -e "uniquerecordname" -A 13 -B 2 -v #does NOT yield the inverse,
> which should be the rest of the file without the record.
Well, it does, sort of. :) The -v is applied first. Then, any
matches are expanded to show the -AB context. Since you don't have a
run of 16 consecutive lines with "uniquerecordname" in them, the
leading/trailing context on every non-matching line overlaps your one
match, and grep ends up printing every line.
> i've tried outputting the grep result in the first example to a new
> file, and then doing a diff on the two -- that works, but it puts a >
> in the beginning of each line, which is unacceptable.
You could pipe THAT output through `` sed -e "s/^> //" '', which would
remove the "> ".
> Is there any other way to do this that I haven't thought of yet?
How about this:
--- deleterecord ---
#!/bin/sh
file="file.txt"
recid=$1
# get the starting line number for the record we're interested in
line=$(grep -n "^# --->$recid" $file) # grep -n prepends line with line num
linenum=${line%%:*} # remove everything after the first colon
if [ -z "$linenum" ] ; then
echo Record $recid not found
exit 1
fi
# calculate the start and end line numbers
start=$(( $linenum - 2 ))
end=$(( $linenum + 13 ))
# delete the offending record
sed -e "${start}-${end}d" < $file > $file.tmp
mv $file.tmp $file
---
-Dan Nelson
dnelson@emsphone.com
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-questions" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?19980904095358.A7658>
