You can use a negative look-ahead: '(?![-)])[[:punct:]]'
This will first check whether the next character is neither a -
nor a )
, and then check it for whether it's a punctuation character. Using a negative look-behind is also possible and might or might not be faster: '[[:punct:]](?<![-)])'
edit: since tr apparently doesn't support Regex (only basic POSIX), you should use another utility, e.g. sed: cat *.txt | sed -r 's/(?![\-@\/\\¤%+[&|=^\]$_*#])[[:punct:]]/\012/g'