O seguinte script Bash mais circunspecto remove primeiro o caracter após a primeira ocorrência de ENV [e tudo antes dele e depois remove o caractere antes da primeira ocorrência de] e depois de tudo. Por favor, diga se você tiver outros casos que impedem este trabalho como pretendido.
x="foo bar ENV['PGHOST'] another bar in NEW['YORK'] to visit";
x=${x#*ENV[?}; x=${x%%?]*}; echo $x
A seguinte versão irá ler um arquivo chamado 'input' e escrever o resultado em um campo chamado 'output'.
cd ~/Desktop;
while IFS= read -r x;
do x=${x#*ENV[?}; echo ${x%%?]*} >> output;
done < input
Se "entrada" contiver:
foo bar ENV['PGHOST'] another bar
foo bar ENV["PGHOST"] another bar
foo bar ENV["PGH'OST"] another bar
foo bar ENV['PGH"OST'] another bar
foo bar ENV['PGHOST'] another bar "what a world" I 'live' in
foo bar ENV["PGHOST"] another bar "what a world" I 'live' in
foo bar ENV['PGHOST'] another bar in NEW['YORK'] to visit
foo bar ENV["PGH'OST"] another bar ["baz"]
então, o seguinte será gravado em 'output':
PGHOST
PGHOST
PGH'OST
PGH"OST
PGHOST
PGHOST
PGHOST
PGH'OST