Como editar programaticamente um arquivo usando apenas o terminal?

8

Eu gostaria de escrever um script de shell através do qual eu pudesse ler o arquivo a partir do comando e editar o arquivo sem intervenção manual (com base na busca de algum texto e substituí-lo por outro).

Eu não preciso usar nenhum editor de texto para isso ... simplesmente pesquisar texto (como usar o grep) e então substituí-lo por outro texto e salvar as alterações ....

    
por Rohit Bansal 09.06.2012 / 07:52

5 respostas

7

É aí que entra sed para jogar. Um comando sed tem este formato:

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

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

# substitute (find and replace) "foo" with "bar" on each line
sed 's/foo/bar/' # replaces only 1st instance in a line
sed 's/foo/bar/4' # replaces only 4th instance in a line
sed 's/foo/bar/g' # replaces ALL instances in a line
sed 's/\(.*\)foo\(.*foo\)/bar/' # replace the next-to-last case
sed 's/\(.*\)foo/bar/' # replace only the last case

# substitute "foo" with "bar" ONLY for lines which contain "baz"
sed '/baz/s/foo/bar/g'

# substitute "foo" with "bar" EXCEPT for lines which contain "baz"
sed '/baz/!s/foo/bar/g'

# change "scarlet" or "ruby" or "puce" to "red"
sed 's/scarlet/red/g;s/ruby/red/g;s/puce/red/g' # most seds
gsed 's/scarlet\|ruby\|puce/red/g' # GNU sed only

Algumas referências

por Rinzwind 09.06.2012 / 08:15
3

Resposta muito tardia. 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 novo arquivo.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, conforme 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
    
por user3832905 01.04.2016 / 22:05
1

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

    
por geirha 09.06.2012 / 12:18
1

Você está procurando sed ou awk. Eu acho sed mais simples e estranho ser mais poderoso.

Veja um exemplo da outra pergunta .

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

Isso significa:

  • pesquise no arquivo /usr/share/applications/defaults.list
  • Localizar / grep gedit.desktop
  • Substituir por yournew.desktop
  • Aplicar as alterações no local -i
por RobotHumans 09.06.2012 / 08:18
0

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

    
por glenn jackman 09.06.2012 / 12:03