ちょっとした処理で、特定の大文字・小文字・数字・記号ごとに、それぞれを違う文字列(大文字=?u、小文字=?l、数字=?d、記号=?s)に置換したいことがあったので、備忘で残しておく。 以下のように、xargsで1文字づつ渡してやり、最初の記号だけ他の置換で被らない文字列(??)に置換してやり、最後にそれを?sに置換することで対応している。

echo 'StrIng$123!' | xargs -d. -n1 -I@ bash -c "printf '@' | sed -e 's/[[:punct:]]/??/g;s/[[:lower:]]/?l/g;s/[[:upper:]]/?u/g;s/[[:digit:]]/?d/g;s/??/?s/g;'"

blacknon@BS-PUB-UBUNTU-01:~$ echo 'StrIng$123!' | xargs -d. -n1 -I@ bash -c "printf '@' | sed -e 's/[[:punct:]]/??/g;s/[[:lower:]]/?l/g;s/[[:upper:]]/?u/g;s/[[:digit:]]/?d/g;s/??/?s/g;'"
?u?l?l?u?l?l?s?d?d?d?s

ちゃちゃっと処理するのであれば、まぁこんな感じでやってしまうのが早いかも。 ちゃんと処理速度を求めるようなものであれば、Pythonなりで書いたほうが良さそう。