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 ...

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


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

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 .


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

0

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

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.