Você usou a sintaxe para a substituição de processo , que passa pelo saída de um comando como entrada para outro comando. Mas o que você queria era substituição de comando , que agarra a saída de um comando como uma linha. A substituição de comandos usa $(…)
.
SUFFIX=$( echo "&*645\[]}#@name" | sed -r 's/[^[:alnum:]]+/_/g' )
Observe que, se você estiver usando o bash, poderá fazer isso com suas próprias construções internas. Se o texto a ser higienizado estiver na variável foo
:
shopt -s extglob
SUFFIX=${foo//+([^[:alnum:]])/_}