Variáveis.
Em qualquer shell, você pode concatenar variáveis ou valores:
$ a=One; b=Two; c=Three
$ d="$a$b$c"; echo $d
OneTwoThree
O tipo de estruturas ${parameter%word}
é POSIX tem sido suportado na maioria dos shells por um longo tempo.
Assumindo FILE=filename.ext
, você poderia fazer:
$ FILE="${FILE%.*}_sometext.${FILE##*.}"; echo "$FILE"
filename_sometext.ext
Essa é uma linha (conforme solicitado) e funciona na maioria dos shells.
Também é possível usar variáveis (mesmo com vários pontos):
#!/bin/bash
FILE=file.one.name.ext
ADDTEXT="_sometext"
EXT="${FILE##*.}"
echo "EXT=$EXT"
echo "final FILE=${FILE%.*}${ADDTEXT}.$EXT"
Ou em apenas uma linha:
ONEFILE=${FILE%.*}${ADDTEXT}.${FILE##*.}
echo "one FILE=$ONEFILE"
Substituição de padrões
O que é complicado é tentar usar ${parameter/pattern/string}
«Substituição de padrões.»
Uma variável funciona em muitos shells (até mesmo em busybox):
NEWTEXT="${ADDTEXT}.${FILE##*.}"
echo "ash FILE=${FILE/.*/${NEWTEXT}}"
Mas não em mais antigos sh
ells.
Apenas para FILE=filename.ext
:
Isso funciona no bash (e ksh, ksh93, mksh, zsh), mas não em ash, dash, sh ou csh
echo "bash FILE=${FILE/%.*/${ADDTEXT}.${FILE##*.}}"
Observe que ele está usando o caractere %
para indicar uma correspondência no final do parâmetro (mas, infelizmente, ele é ávido e come todos os pontos em FILE=file.one.name.ext
).
Conclusão
O melhor método para controlar quão gananciosa é a substituição é usar variáveis separadas (em oposição a algumas de "Substituição de padrões").