web-dev-qa-db-fra.com

Comment éditer une ligne spécifique de fichier texte dans un terminal avec un script?

Je dois changer un .config fichier texte à chaque fois que le programme ne fonctionne pas comme je le souhaite. Je veux pouvoir le faire en terminal de préférence avec un alias et avec la logique suivante:

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

Ainsi, lorsque j'entre config dans le terminal, la ligne incriminée sera modifiée, après quoi une commande sera exécutée, après quoi la ligne sera définie pour être ce qu'elle était au début

1
fdsfgdsdf

Voici une solution détaillée comme un script python. Pas littéralement ce que vous demandiez, mais une solution:

#!/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+'"')

Pour l'utiliser:

  • créez un dossier dans un répertoire sécurisé pour stocker les deux versions de vos fichiers de configuration.
  • créer un ~/bin dossier.
  • copiez le code ci-dessus dans un fichier et appelez-le toggle_config (ou tout ce que vous voulez).
  • changer les lignes dans la section de tête pour les chemins, la ligne et les messages corrects que vous aimeriez voir lorsque les paramètres sont basculés
  • enregistrez le fichier et rendez-le exécutable. stockez-le dans ~/bin, ou copiez-le dans /usr/bin pour plus de sécurité.

Après déconnexion/connexion, vous pourrez basculer entre les deux versions de paramètres, par la commande

toggle_config

On vous demandera votre mot de passe et vous verrez un message comme celui-ci:

enter image description here

Vous pouvez également créer un fichier .desktop avec la commande et le verrouiller sur le lanceur pour basculer rapidement entre les paramètres.

1
Jacob Vlijm

Cela ressemble beaucoup à un pansement et à un problème XY et vous feriez mieux de comprendre le problème principal. Pourtant, ces commandes feront ce dont vous avez besoin. Je l'ai écrit comme une fonction Shell, pas un alias, mais ajoutez simplement ces lignes à votre ~/.bashrc fichier:

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
} 

Vous pouvez ensuite l'exécuter en exécutant fix_config.

1
terdon