Suponho que você esteja reescrevendo um arquivo de texto que cabe na memória (parece que você está reescrevendo um arquivo de configuração).
O script a seguir usa somente recursos internos do shell e cat
. Deve funcionar no shell do Android, pelo menos desde Gingerbread e definitivamente desde Ice Cream Sandwich. Imprime o conteúdo do arquivo menos a primeira ocorrência de $PAT
se houver um; se $PAT
não ocorrer, nada será impresso.
contents=$(cat "$FILE")
case $contents in
*"$PAT"*)
echo "${contents%%$PAT*}${contents#*$PAT}";;
esac
Esse snippet pressupõe que o arquivo não contém nenhum byte nulo, termina em uma única nova linha e não inicia com um traço. Além disso, se o padrão terminar com uma nova linha, ele não será encontrado no final do arquivo. Os snippets mais complexos a seguir lidam com arquivos de texto arbitrários:
contents=$(cat "$FILE"; echo a)
contents=${contents%a}
case $contents in
*"$PAT"*)
contents="${contents%%$PAT*}${contents#*$PAT}"
dashes=${contents%%[!-]*}
echo -n "$dashes"
echo -n "${contents#$dashes}";;
esac
(Observe que o comportamento proposto torna impossível distinguir um arquivo que contenha exatamente o padrão e um arquivo vazio.)
Na verdade, é mais fácil implementar seu script de acréscimo / remoção diretamente do que usar a função intermediária proposta.
contents=$(cat "$FILE"; echo a)
contents=${contents%a}
append=
case $contents in
*"$PAT"*) contents="${contents%%$PAT*}${contents#*$PAT}";;
*) contents="$contents$PAT"
esac
dashes=${contents%%[!-]*}
{ echo -n "$dashes"; echo -n "${contents#$dashes}"; } >"$FILE.new"
mv -- "$FILE.new" "$FILE"