A sed syntax

littlebat dashing.meng at gmail.com
Wed Jun 23 05:17:52 PDT 2010


On Wed, 23 Jun 2010 05:22:35 -0500
Mike McCarty <Mike.McCarty at sbcglobal.net> wrote:

So much detailed answer, I can post it into my blog as a detailed
manual. too many thanks.

> littlebat wrote:
> > Hi,
> > I am learning LFS BOOK:
> > http://www.linuxfromscratch.org/lfs/view/6.6/chapter05/adjusting.html
> > 
> > Below is a sed syntax I can't understand and haven't found a place
> > to learn it. 
> > <code>
> > sed -e "/^\*cpp:$/{n;s,$, -isystem /tools/include,}"
> > </code>
> 
> You already got a good answer, perhaps a little more detail helps...
> I'm no sed expert, but this is the way I read that command.
> 
> sed	the command
> 
> -e	means "execute this little program which follows"
> 
>   "	the quotes are necessary to keep the shell from
> 	trying to do stuff with what's here, and to make
> 	what follows "all one argument" to the program
> 
> /	sed looks at the first character, and takes that
> 	to be the "delimeter". So, everything from here to
> 	the next "/" is the "address" sed will use to select
> 	lines from the file; the program gets executed on lines
> 	which match this pattern, all other lines pass through
> 	unchanged
> 
> ^	this indicates that the pattern must start at
> 	the beginning of the line
> 
> \*	we have to "escape" the "*", or the shell will try to
> 	put file names in there, hence the "\" to make this
> 	a literal "*"
> 
> cpp:	more string to look for
> 
> $	this says that when we've matched what went before,
> 	we must next find end of line, so, the entire line
> 	must be "*cpp:", so the command gets executed only
> 	on lines which contain "*cpp:" and nothing else
> 
> /	here's the other delimeter "/" which ends the "address"
> 
> {	this tells sed that what is contained is the script to
> 	execute, when we find a matching line; we do so up to
> 	the closing "}"
> 
> n	Read/append the next line of input into the pattern space
> 	IOW, print what has been matched so far ("*cpp:") and
> 	then work on the next line
> 
> ;	end of "n" command, so all we print is just "*cpp:"
> 	we use ";" to put multiple commands together, so this
> 	separates the "n" command from the "s" command
> 
> s	now we start a "substitute" command
> 
> ,	this is taken by sed to be the delimter of the string
> 	to substitute for; this could be any character, like
> 	the "/" above; the "s" command wants
> 
> 	s<delim><string to find><delim><string to sub><delim>
> 
> 	where <delim> may be any character you like, but all three
> 	must be the same. In this case, ","
> 
> $	the pattern we are going to substitute for is end of line...
> 
> ,	... and nothing else, the second "," matches the one above
> 	and ends the search string
> 
>   -isystem /tools/include
> 	this is the string to substitute at end of line
> 
> ,	here's the third delimeter
> 
> }	this marks end-of-command
> 
> "	this is the matching quote for the shell to see
> 
> HTH
> 
> Mike
> -- 
> p="p=%c%s%c;main(){printf(p,34,p,34);}";main(){printf(p,34,p,34);}
> Oppose globalization and One World Governments like the UN.
> This message made from 100% recycled bits.
> You have found the bank of Larn.
> I speak only for myself, and I am unanimous in that!
> -- 
> http://linuxfromscratch.org/mailman/listinfo/lfs-support
> FAQ: http://www.linuxfromscratch.org/lfs/faq.html
> Unsubscribe: See the above information page


--
littlebat



More information about the lfs-support mailing list