probably just an escaping problem. for instance use "$-" instead on some operating system, some need \$- etc.
I would test with a rule that doesn't need escaping at all, like:
hashcat -j u ...
I think in your case it makes sense to have dicts where the special characters and numbers are already appended and/or prepended and combine them during the actual attack/cracking.
e.g.
Code:
hashcat --stdout -a 6 -1 ?d?s -o dict.txt raw_wordlist.txt ?1
hashcat --stdout -a 7 -1 ?d?s -o dict.txt ?1 raw_wordlist.txt
hashcat -m 0 -w 3 -O -a 1 hashes.txt dict.txt dict.txt
to optimize things you could also optimize the --custom-charset1 (or short -1) to only contain the chars that are for sure needed (maybe not every character in ?s is allowed in your case) and also make 2 dicts instead of only one "dict.txt" and both sides are more optimized (but it's also a little bit more work for you and might not be worthwhile depending on how fast the hashing algorithm you need is, I see -m 0 in your command line which is of course a very fast algo)
of course the rule-based attack is nice too, but the problem is that -j/-k do not allow rule *files*, only single rules are accepted, so you would need to launch hashcat for each and every new rule (and rule combination, if you use -j AND -k)