9fans - fans of the OS Plan 9 from Bell Labs
 help / color / mirror / Atom feed
From: Noah Evans <noah.evans@gmail.com>
To: Fans of the OS Plan 9 from Bell Labs <9fans@9fans.net>
Subject: Re: [9fans] sed question (OT)
Date: Fri, 30 Oct 2009 21:53:36 +0100	[thread overview]
Message-ID: <56a297000910301353p29baf584g3305d9548215e1f7@mail.gmail.com> (raw)
In-Reply-To: <f631016df731e553421e6079dd1da0d4@quintile.net>

This kind of problem is character processing, which I would argue is
C's domain. You can massage awk and sed to do the job for you, but at
least for me it's conceptually simpler to just bang out the following
C program:

#include <u.h>
#include <libc.h>
#include <bio.h>

#define	isupper(r)	(L'A' <= (r) && (r) <= L'Z')
#define	islower(r)	(L'a' <= (r) && (r) <= L'z')
#define	isalpha(r)	(isupper(r) || islower(r))
#define	isspace(r)	((r) == L' ' || (r) == L'\t' \
			|| (0x0A <= (r) && (r) <= 0x0D))
#define	toupper(r)	((r)-'a'+'A')

void
usage(char *me)
{
	fprint(2, "%s: usage\n", me);
}

void
main(int argc, char **argv)
{
	Biobuf in, out;
	int c, waswhite, nwords;

	ARGBEGIN{
	default:
		usage(argv[0]);
	}ARGEND;
	Binit(&in, 0, OREAD);
	Binit(&out, 1, OWRITE);
	
	waswhite = 0;
	nwords = 0;
	while((c = Bgetc(&in)) != Beof){
		if(isalpha(c))
		if(waswhite)
		if(nwords < 2){
			if(islower(c))
				c = toupper(c);
			nwords++;
		}
		if(isspace(c))
			waswhite = 1;
		else
			waswhite = 0;
		if(c == '\n')
			nwords = 0;
		Bputc(&out, c);
	}
	exits(0);
}

Noah


On Thu, Oct 29, 2009 at 4:41 PM, Steve Simon <steve@quintile.net> wrote:
> Sorry, not really the place for such questions but...
>
> I always struggle with sed, awk is easy but sed makes my head hurt.
>
> I am trying to capitalise the first tow words on each line (I could use awk
> as well but I have to use sed so it seems churlish to start another process).
>
> capitalising the first word on the line is easy enough:
>
>                        h
>                        s/^(.).*/\1/
>                        y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/
>                        x
>                        s/^.(.*)/\1/
>                        x
>                        G
>                        s/\n//
>
> Though there maye be a much easier/more elegant way to do this,
> but for the 2nd word it gets much harder.
>
> What I really want is sam's ability to select a letter and operate on it
> rather than everything being line based as sed seems to be.
>
> any neat solutions? (extra points awarded for use of the branch operator :-)
>
> -Steve
>
>



  parent reply	other threads:[~2009-10-30 20:53 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2009-10-29 15:41 Steve Simon
2009-10-29 16:06 ` Lorenzo Bolla
2009-10-29 16:33   ` Iruata Souza
2009-10-29 16:42     ` Lorenzo Bolla
2009-10-29 16:09 ` W B Hacker
2009-10-29 18:52 ` Jason Catena
2009-10-30 13:35 ` Eris Discordia
2009-10-30 13:39 ` Eris Discordia
2009-10-30 17:30   ` W B Hacker
2009-10-30 17:39     ` [9fans] sed question (OT) (OT) (OT) Tim Newsham
2009-10-30 18:14       ` [9fans] sed question (OT) (OT) (OT) (OT) (OT)(OT)(OT)(OT)(OT)(OT)(OT)(OT)(OT)(OT) W B Hacker
2009-10-30 15:29 ` [9fans] sed question (OT) dave.l
2009-10-30 20:53 ` Noah Evans [this message]
2009-11-11 12:32 ` frankg
     [not found] <<80c99e790910290906t36766978kcd38c9583392e038@mail.gmail.com>
2009-10-29 16:08 ` erik quanstrom
2009-10-29 16:29   ` Iruata Souza
     [not found] <<d1c554290910290929p3980a256hf075042ca3a3917b@mail.gmail.com>
2009-10-29 16:31 ` erik quanstrom
     [not found] <<A3AADD7F-E09D-49F9-8A5B-3D6B720046A4@mac.com>
2009-10-30 16:16 ` erik quanstrom

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=56a297000910301353p29baf584g3305d9548215e1f7@mail.gmail.com \
    --to=noah.evans@gmail.com \
    --cc=9fans@9fans.net \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).