Como editar programaticamente um arquivo usando apenas o terminal?

13

Desejo escrever um script de shell no qual eu possa ler o arquivo do comando e editá-lo sem intervenção manual (com base na pesquisa de algum texto e na sua substituição por outro).

Eu não preciso usar nenhum editor de texto para isso ... simplesmente pesquisando texto (como usar grep) e substituindo-o por outro texto e salvando as alterações ...

Rohit Bansal
fonte

Respostas:

10

É aí que sedentra para jogar. Um sedcomando tem este formato:

[pattern1][,pattern2][!] command [args]

Ele usa expressões regulares para que possa / será um pouco difícil. Alguns exemplos básicos extraídos do segundo link abaixo:

# substitua (encontre e substitua) "foo" por "bar" em cada linha
sed 's / foo / bar /' # substitui apenas a 1ª instância em uma linha
sed 's / foo / bar / 4' # substitui apenas a quarta instância em uma linha
sed 's / foo / bar / g' # substitui TODAS as instâncias em uma linha
sed 's / \ (. * \) foo \ (. * foo \) / \ 1bar \ 2 /' # substitui o penúltimo caso
sed / \ (. * \) foo / \ 1bar / '# substitui apenas o último caso

# substitua "foo" por "bar" APENAS por linhas que contenham "baz"
sed '/ baz / s / foo / bar / g'

# substitua "foo" por "bar", EXCETO as linhas que contêm "baz"
sed '/ baz /! s / foo / bar / g'

# mude "escarlate" ou "rubi" ou "puce" para "vermelho"
sed 's / escarlate / vermelho / g; s / rubi / vermelho / g; s / puce / vermelho / g' # most seds
gsed 's / scarlet \ | ruby ​​\ | puce / red / g' # apenas GNU sed

Algumas referências

Rinzwind
fonte
7

Resposta muito tarde. No entanto, isso pode ajudar outras pessoas com um problema / pergunta semelhante.

Eu recomendaria criar e aplicar um patch. Um bom exemplo pode ser encontrado aqui .

Por exemplo, supondo que um arquivo new.txt contenha alterações que você deseja aplicar ao old.txt. Você pode executar os comandos em um terminal ou criando e executando um patch_file.sh.

Linha de comando: abra um terminal e copie e execute as linhas abaixo (altere os nomes dos arquivos conforme necessário):

diff old.txt new.txt > patch.patch # to create the patch
patch old.txt -i patch.patch -o patched_old.text # to apply patch

Script: usando uma abordagem de arquivo .sh. Em um terminal (teclado: ctrl + alt + t: gedit patch_file.sh

Copie e cole os comandos que iriam no terminal, para o arquivo .sh e abaixo do cabeçalho, como mostrado abaixo (gedit).

#!/bin/sh
diff old.txt new.txt > patch.patch # to create the patch
patch old.txt -i patch.patch -o patched_old.text # to apply patch

Torne o script executável (terminal):

chmod +x patch_file.sh

Execute o script (terminal):

./patch_file.sh # may require sudo access depending on the directory affected
user3832905
fonte
O patch +1 é sempre o caminho certo para modificações médias a pesadas ou complexas. Não sei por que alguns tentam fazer tudo usando as ferramentas de regex.
user.dz
+1 é muito melhor do que a engenharia reversa de uma regex que parece aplicar a alteração desejada no arquivo com o qual você testa ... mas quando aplicada a outras instâncias desse arquivo às vezes tem outros efeitos.
bigjosh
Um patch faz sentido se eu quiser substituir todas as instâncias de sequências de texto específicas, ou seja, substituir todas "" por "_", todas as "menos" por "-" e todas as "gb | <string_of_numbers> | ARO:" por " ARO: "? Obrigado.
19289 Josh
1

Se você deseja editar um arquivo, use um editor de arquivos, existem editores de arquivos baseados em comandos que podem ser usados ​​em scripts, como ex ou ed .

Geirha
fonte
1

Você está procurando por sed ou awk. Acho sed mais simples e awk mais poderoso.

Aqui está um exemplo de outra pergunta .

sed -i 's/gedit.desktop/yournew.desktop/g' /usr/share/applications/defaults.list

Isso significa:

  • pesquisar no arquivo /usr/share/applications/defaults.list
  • Localizar / grep gedit.desktop
  • Substituir com yournew.desktop
  • Aplique as alterações no local -i
RobotHumans
fonte
0

Dependendo do que você precisa editar, se você estiver familiarizado vi, edpode ser útil.

Glenn Jackman
fonte