You can use a regex in bash (3.0 or above) to accomplish this:
if [[ $strname =~ 3(.+)r ]]; then
strresult=${BASH_REMATCH[1]}
else
echo "unable to parse string $strname"
fi
In bash, capture groups from a regex are placed in the special array BASH_REMATCH
. Element 0 contains the entire match, and 1 contains the the match for the first capture group.
if ($mystr:q =~ *'\
'*) echo yes
should work in some implementations and versions of csh
(like the csh
and tcsh
ones found on Debian). In some others (like the one found on Solaris 10), you may have better luck with
set nl = '\
'
if ($mystr:q =~ *$nl:q*) echo yes
Most people have given up trying to write reliable scripts with csh
by now. Why would you use csh
in this century?
This code works for me (outputs no
) in tcsh 6.17.00 (Astron) 2009-07-10 (x86_64-unknown-linux) options wide,nls,dl,al,kan,rh,color,filec
set mystr = '1234ABC\
-------\
FOOBAR'
if ($mystr:q !~ *'\
'*) then
echo yes
else
echo no
endif
Note that if you do:
set var = `some command`
csh
stores each word (blank separated) of the output of some command
in several elements of the var
array.
With:
set var = "`some command`"
it stores each non-empty line in elements of the array.
It looks like one cannot1 store the output of a command whole into a variable in (t)csh
, so your only option would be:
set var = "`some command`" # note that it removes the empty lines
if ($#var == 1)...
1 Strictly speaking, that's not true, one could do something like:
set x = "`some command | paste -d. /dev/null -`"
set var = ""
set nl = '\
'
foreach i ($x:q)
set i = $i:s/.//:q
set var = $var:q$i:q$nl:q
end
(of course, it may not work in all csh
implementations/versions)
Best Answer
In a POSIX shell, the syntax
${t:-2}
means something different - it expands to the value oft
ift
is set and non null, and otherwise to the value2
. To trim a single character by parameter expansion, the syntax you probably want is${t%?}
Note that in
ksh93
,bash
orzsh
,${t:(-2)}
or${t: -2}
(note the space) are legal as a substring expansion but are probably not what you want, since they return the substring starting at a position 2 characters in from the end (i.e. it removes the first characteri
of the stringijk
).See the Shell Parameter Expansion section of the Bash Reference Manual for more info: