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 <st...@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
>
>

Reply via email to