Como editar uma linha específica de arquivo de texto no terminal com um script?

0

Eu preciso alterar um arquivo de texto .config toda vez que o programa não funcionar como eu quero. Eu quero ser capaz de fazê-lo no terminal, de preferência com um alias e com a seguinte lógica:

alias config='change line 17 to this THEN run this command THEN replace line 17 with what was at beginning'

Então, quando eu inserir config no terminal, a linha incorreta será alterada, após o que um comando será executado, após o qual a linha será configurada para ser o que era no começo

    
por fdsfgdsdf 06.04.2014 / 17:31

2 respostas

1

Isso soa muito como um band-aid e um problema XY e seria melhor descobrir o problema central. Ainda assim, esses comandos farão o que você precisa. Eu escrevi como uma função de shell, não um alias, mas apenas adicione essas linhas ao seu arquivo ~/.bashrc :

fix_config(){
    ## Change current working directory to the directory where .config file is located
    cd /path/to/config_file
    ## The original 17th line
    old="$(sed '17q;d' .config)"
    ## The one you will replace it with
    new="new line"
    ## The sed command that does the replacing
    sed -i.bak "17 s/$old/$new/" .config
    ## Run whatever needs to be run with the modified file
    command
    ## Copy the file back
    cp .config.bak .config
    ## Go back to the old working directory
    cd $OLDPWD
} 

Você pode executá-lo executando fix_config .

    
por terdon 06.04.2014 / 19:28
1

Aqui está uma solução detalhada como um script python. Não literalmente o que você estava pedindo, mas ainda uma solução:

#!/usr/bin/python3

import os

# change the lines below to the correct paths
path_to_configfile = "path_to_configfile" # the real one in  /etc/dhcp/dhclient.conf
path_toconfigfile_a = "path_toconfigfile_a"
path_toconfigfile_b = "path_toconfigfile_b"
# change the line to the default line in the config file (leave the \n)
old_line = "old_line\n"
# change to the line number to check as an indicator
line_number = 17 # first line =  1
# change to the messages you'd like to see
config1_message = "config 1 is activated"
config2_message = "config 2 is activated"

with open(path_to_configfile) as defaultconfig:
    defaultconfig = defaultconfig.readlines()

if defaultconfig[line_number-1] == old_line:
    os.system('gksudo cp '+"'"+path_toconfigfile_a+"'"+" "+"'"+path_to_configfile+"'")
    os.system('zenity --info --text '+'"'+config1_message+'"')
else:
    os.system('gksudo cp '+"'"+path_toconfigfile_b+"'"+" "+"'"+path_to_configfile+"'")
    os.system('zenity --info --text '+'"'+config2_message+'"')

Para usá-lo:

  • crie uma pasta em um diretório seguro para armazenar as duas versões de seus arquivos de configuração.
  • crie uma pasta ~/bin .
  • copie o código acima em um arquivo e chame de toggle_config (ou qualquer coisa que você goste).
  • altere as linhas no cabeçalho para os caminhos, linhas e mensagens corretos que você gostaria de ver quando as configurações forem alternadas
  • salve o arquivo e torne-o executável. armazene-o em ~/bin ou copie-o para /usr/bin para mais segurança.

Após o logout / login, você poderá alternar entre as duas versões de configuração, pelo comando

toggle_config

Ser-lhe-á pedida a sua palavra-passe e verá uma mensagem como esta:

Como alternativa, você pode criar um arquivo .desktop com o comando e bloqueá-lo no iniciador para alternar rapidamente entre as configurações.

    
por Jacob Vlijm 06.04.2014 / 23:03