Se todos os nomes contiverem um sublinhado, basta combinar as duas partes do nome separadamente. Você provavelmente não quer a substituição em qualquer lugar da linha, apenas no final do nome do arquivo, então perca o modificador g
.
ls | sed 's/^\(.*\)_\(.*\)\.png$/_\/,/'
A propósito, ls -1
é equivalente a ls
quando não usado interativamente. ls *
não é equivalente a ls
, a principal diferença é que, se o diretório atual contiver subdiretórios, ls
listará as entradas no diretório atual, enquanto ls *
listará as entradas que não são subdiretórios mais o conteúdo de todos subdiretórios. Dado que isso quase nunca é útil, você presumivelmente quis dizer ls
.
Se você quiser remover todos os sublinhados, não importa quantos sejam, enquanto é possível usar sed, é mais claro no awk.
ls | awk 'sub(/\.png$/, "") {$0 = $0 "/" gsub(/_/, "", $0) ","} 1'
Como alternativa, você pode usar um loop de shell.
for x in *; do
case $x in
*.png) x=${x%.png}; printf '%s/\n' "$x"; printf '%s,\n' "$x" | tr -d _;;
esac
done