Isso resolverá seu primeiro problema:
echo "[STATUS REPORT] PROJECT" | awk '{ gsub(/PROJECT/, "A\&A"); print }'
( & é um caractere especial em substituição de awk: significa "o que foi correspondido". Você precisa escapar com \ . E como você está em uma string do awk, é necessário colocar 2 \ para produzir um como \ escape do próximo char como em \n .)
Isso resolverá seu segundo problema:
ProjectName=toto
echo "[STATUS REPORT] PROJECT" | awk -v "ProjectName=$ProjectName" '{ gsub(/PROJECT/, ProjectName); print }'
( Editar : observe o recém-adicionado " em torno de ProjectName=$ProjectName , para que um espaço em ProjectName não quebre o script.)
Mas o awk é uma grande ferramenta para realizar a substituição de strings, você pode querer usar o sed:
echo "[STATUS REPORT] PROJECT" | sed -e 's/PROJECT/A\&A/'
ProjectName=toto;
echo "[STATUS REPORT] PROJECT" | sed -e "s/PROJECT/${ProjectName//\//\/}/"
( Editar : um / em ProjectName will estava quebrando a solução inicial. Eu adicionei o escape de barras, mas outro (s) outro (s) caractere o quebra: & , , ... Eu acho que o shell abaixo é mais seguro.)
ou no shell bash simples:
msg="[STATUS REPORT] PROJECT"
echo ${msg//PROJECT/A&A}
ProjectName=toto
echo ${msg//PROJECT/$ProjectName}