On Thu, May 27, 2010 at 12:17 AM, Jack Schwartz
<[email protected]> wrote:
> Thanks for helping...
[snip]
> # read file into variable "input"
> input="$( < 'zzz' )"
>
> # pick the data, \3 refers to the content matched by the pattern in
> the 3rd ()-bracket pair
> match="${input/~(Elr-g).*([^[:space:]]*ramdisk[^[:space:]]*)([[:space:]]+)([^[:space:]])([[:space:]]+).*/\3}"
>
> if [[ $match != "$input" ]] ; then
> printf 'match is %q\n' "$match"
> else
> print -u2 'no match found.'
> fi
> -- snip --
>
> The core in this example is the line...
> -- snip --
> ${input/~(Elr-g).*([^[:space:]]*ramdisk[^[:space:]]*)([[:space:]]+)([^[:space:]])([[:space:]]+).*/\3}
> -- snip --
> It grabs the value of variable "input" and returns the content which
> matches the extended regular pattern (that does the ~(Elr-g) specify:
> Extended regular pattern ("E") with left ("l") and right ("r")anchors
> and greedy matching ("-g", the greedy mode matches the shortest
> pattern, the default for regular expressions is to match the longest
> character sequence)) in the 3rd bracket pair. If no match is found the
> full value of variable "input" is returned.
>
> Notes:
> 1.I made the example a bit more verbose, AFAIK the [:space:] can be
> replaced with a plain white space assuming /etc/mnttab doesn't use
> both SPACE and TAB in the same file.
> 2. [^ ] means: This pattern matches a single character which is not a
> space (^ means "not")
> 3. * matches zero or more characters and + matches one or more characters
> ----
[snip]
> This info is good to know. However, for this particular example, I think it
> is clearer to use nawk just because it will be shorter. Alex helped me with
> this already, and it works:
Erm... I doubt it is shorter because you run a seperate process which
shuffels around a few MB during loading&&starting. It only _looks_
shorter (but you are right, for those who don't do regex pattern stuff
often the solution using "awk" looks easier (but IMO at an expense of
being an overkill. IMHO heavywheight filters like sed/awk/tr/etc.
should only be used if there are more data to process than at least
1MB. It's IMO not efficient to move around flies using elephants...)).
> /usr/bin/nawk '$1 ~ /ramdisk/ {if ($2 ~ /^\/$/) print $2}' \
> </etc/mnttab
>
> However, I am running into a problem when I try to do something similar, but
> where I pass the match-string in as a variable:
>
> VARPKG=/var/pkg
> varpkg_fstype=($/usr/bin/nawk \
> '{if ($2 == $VARPKG) print $3}' </etc/mnttab
>
> Problem is that $VARPKG is not getting interpretted into /var/pkg before
> getting passed to nawk.
You use '...' to pass the awk program and anything within '...' is
passed as plain literal to awk. If you want that $ gets interpreted by
the shell then you must use "..."-style string literals.
----
Bye,
Roland
--
__ . . __
(o.\ \/ /.o) [email protected]
\__\/\/__/ MPEG specialist, C&&JAVA&&Sun&&Unix programmer
/O /==\ O\ TEL +49 641 3992797
(;O/ \/ \O;)
_______________________________________________
caiman-discuss mailing list
[email protected]
http://mail.opensolaris.org/mailman/listinfo/caiman-discuss