Como substituir a string do arquivo, que está presente no arquivo tar através do UNIX

1

Eu tenho um arquivo tar xyz.tar contendo muitos arquivos .sh como:

123.sh
456.sh
789.sh

Todo arquivo .sh tem algum conteúdo de string, por exemplo 123.sh contém bem-vindo a Hollywood, 456.sh contém Eu amo Hollywood e 789.sh contém filmes de Hollywood.

Agora, meu objetivo é substituir a string Hollywood by Oscar em todos os arquivos .sh usando um loop.

Eu tentei este comando:

for i in $(tar -xvf xyz.tar); do sed -e 's/Hollywood/Oscar/' $i; done

Estou obtendo a saída na janela de comando, mas o / p não está refletindo no arquivo xyz.tar porque não é possível recompactar o arquivo tar, após o comando de extração e substituição.

    
por Abhi 04.03.2015 / 09:31

1 resposta

2

Antes de mais nada, você deve perceber que um arquivo .tar normalmente não é compactado (é mais provável que ele tenha uma extensão .tar.gz ou .tar.xz se for).

E o seu tar -xvf xyz.tar extrai os arquivos e lista os nomes, o sed funciona na lista de nomes de arquivos, nem mesmo o conteúdo do arquivo.

Se você tiver exatamente as mesmas substituições de tamanho que os originais, então você poderia teoricamente (como arquivos tar não ter checksum) substituir as strings no .tar . No entanto, é melhor primeiro extrair todos os arquivos em um diretório temporário e, em seguida, percorrer a árvore usando

find . -name "*.sh" -print0 | xargs -0 sed -i -e 's/Hollywood/Oscar/'

e depois recriar o arquivo tar deste diretório temporário.

Isso pressupõe que seu sed suporta -i (substituindo o arquivo de entrada pelo conteúdo editado), se você não fizer um pequeno script que chame sed e grave a saída em um arquivo temporário, copia o arquivo de volta quando sed é concluído.

    
por 04.03.2015 / 09:42