Article View: comp.text
Article #4662Interaction of sed N and d commands
From: Daniel Gilly
Date: Wed, 27 Apr 1988 19:19
Date: Wed, 27 Apr 1988 19:19
86 lines
3789 bytes
3789 bytes
I need help with the interaction between the sed N command and other
commands. Note that I solved the problem presented here by making two
passes with sed; I don't need solutions (although particularly elegant
ones are always appreciated). What I am trying to do is to
understand why sed acts the way it does. I encountered some puzzling
behavior, and hope that someone out there can shed light on it.
I have a file containing these lines:
.SH "Related Commands"
.\"see also here
.br
\f(CWXRemoveHost\fP
.br
\f(CWXRemoveHosts\fP
.br
\f(CWXDisableAccessControl\fP
.br
\f(CWXEnableAccessControl\fP
.br
\f(CWXSetAccessControl\fP
.br
.\"last line comment
I've been having trouble using sed to get it to look the way I want.
First, I want to remove the .br's. Then, I want to add a comma after
each X function, except the last one, which should have a period.
I've tried using the N command but I get unexpected results.
When I tried this: I got this:
/"Related Commands"/,/last line/{ .SH "Related Commands"
/\.br/d .\"see also here
/fP/{ \f(CWXAddHost\fP
N .br,
s/$/,/ \f(CWXAddHosts\fP
s/fP *\(\n.*last line\)/fP.\1/ .br,
} \f(CWXListHosts\fP
} .br,
\f(CWXRemoveHost\fP
.br,
\f(CWXRemoveHosts\fP
.br,
\f(CWXRemoveHosts\fP
.br,
\f(CWXDisableAccessControl\fP
.br,
\f(CWXEnableAccessControl\fP
.br,
\f(CWXSetAccessControl\fP
.br,
.\" last line comment
I understand that once N has been applied to a line, the next line is
joined to that one, and not processed independently. Nonetheless,
I would expect that the /.br/d command would cause the entire line to
be deleted. Instead, it is ignored.
It seems that the N command supersedes the /\.br/d command. That is,
instead of deleting .br's and then joining lines, it joins them first,
then ignores the delete. Is there something obscure about the order
in which sed operates on a file? I also tried moving the /\.br/d
line.
When I tried: I got:
/"Related Commands"/,/last line/{ .SH "Related Commands"
/fP/{ .\"see also here
N .\"last line comment
s/$/,/
s/fP *\(\n.*last line\)/fP.\1/
}
}
/\.br/d
This was expected, since the /\.br/ now matches a multi-line pattern.
But why don't these two scripts produce the same result, and why won't
sed let me delete a line if a join is later going to be applied to it?
--
Daniel Gilly (617) 527-4210
O'Reilly & Associates, Inc., Publishers of Nutshell Handbooks
981 Chestnut Street, Newton, MA 02164
UUCP: uunet!ora!daniel ARPA: daniel@ora.uu.net
Technical Details
Message-ID:
<1148@ora.UUCP>Path:
arc1-ca.pugleaf.net!utzoo!mnetor!uunet!lll-winken!lll-tis!ames!necntc!adelie!ora!danielShow Full Headers
Complete Article Headers
Path: arc1-ca.pugleaf.net!utzoo!mnetor!uunet!lll-winken!lll-tis!ames!necntc!adelie!ora!daniel From: daniel@ora.UUCP (Daniel Gilly) Newsgroups: comp.text,comp.unix.questions Subject: Interaction of sed N and d commands Message-ID: <1148@ora.UUCP> Date: 27 Apr 88 19:19:58 GMT Organization: O'Reilly & Associates, Inc., Newton, MA Lines: 85 Keywords: sed