php -i | sed -n '/extension_dir/{s/^[^/]*//;s/ *=>.*$//;p;}'
ou, como sugerido nos comentários abaixo,
php -i | sed '/extension_dir/!d;s/[^/]*//;s/ *=>.*//'
O sed acima substitui seu grep e, para cada linha que corresponda a extensions_dir , primeiro removerá tudo até o primeiro / e depois tudo, desde o primeiro => no modificada string. Todos os espaços antes do => também são removidos. As linhas que não correspondem a extensions_dir são ignoradas.
Isso retornará o caminho desejado para a primeira linha de entrada e uma linha vazia para o segundo.
Para desconsiderar a segunda linha de entrada, use /^extension_dir/ em vez de /extension_dir/ no sed acima. Isso descartará a segunda linha, pois não inicia com essa string.
É a combinação de seus dois scripts sed que produz o resultado surpreendente para a segunda linha de entrada.
A linha é
sqlite3.extension_dir => no value => no value
e o primeiro sed modificará isso para
sqlite3.no value => no value
O segundo sed removerá o bit => no value no final.
Note que
echo $( ... )
é um pouco inútil, pois engole as novas linhas na saída do comando dentro de $( ... ) . Em vez disso teste com apenas o comando sem a substituição do comando echo ou $( ... ) .
É possivelmente esse uso de echo que você confundiu sobre a natureza da saída de php -i e grep (duas linhas de correspondência em vez de uma).