Zsh Mailing List Archive
Messages sorted by: Reverse Date, Date, Thread, Author

Re: input foo, output '[F|f][O|o][O|o]'?




On 1 Jul 2013, at 14:44, ZyX wrote:

I do not think you will find a way to do this. All regex engines (precisely, programs that are using them) I know support a way to set case sensitivity for the whole regular expression and some support toggling this for a part of regular expression. In grep this is an -i switch, for vim it is either /i or \c/\C, for sed this is /i, for PCRE and perl this is additionally (?i) "atom" (additionally to other ways of toggling the behavior which are highly dependent on programs embedding PCRE; for perl this is usual /i flag). Even zsh globs do support (#i).

Phil Pennock's version worked great:

% foo=CrashPlan
% for c in ${(s::)foo}; do print -n "[${(U)c}|${(L)c}]";done; print
[C|c][R|r][A|a][S|s][H|h][P|p][L|l][A|a][N|n]
%


By the way, what regex engine is your output for? Any I am aware of parse "[N|n]" as "either one of three characters: N, n, or pipe".

Really? I can think of several that support it. Maybe it's because I'm old enough to remember when a lot of these utilities didn't have 'ignore case'

% echo "foo\nbar\nbat" | egrep -v '[F|f]'
bar
bat

% echo "foo\nbar\nbat" | sed 's#[F|f][O|o][O|o]#XXX#g'
XXX
bar
bat

You can also use it for matching case/esac :

case "$i" in
	[C|c][R|r][A|a][S|s][H|h][P|p][L|l][A|a][N|n])
			echo "matched crashplan"
	;;

	*)
			echo "No Match"
	;;

esac


I am also assuming XY problem here: what for do you need such conversion? You should consider lowercasing the tested string if nothing like -i is available.

It's for use with the AddDescription directive for .htaccess which (from what I understand) takes its case sensitivity from the underlying filesystem when matching filenames. There's no "ignore case" flag or anything else that I can use with it, so my only option (at least, the only one I can think of) is the one that I suggested. For example, if I wanted to add this for any files which start with 'BBEdit' (case insensitive) this is what I'd need to use:

AddDescription "<a href='http://barebones.com/bbedit'>A text editor that doesn't suck</a>" [B|b][B|b][E|e][D|d][I|i][T|t]*

I verified that it works, but typing that stuff manually is tedious and highly error prone, which made it the perfect place for a shell script :-)

TjL



Messages sorted by: Reverse Date, Date, Thread, Author