Как редактировать конкретную строку текстового файла в терминале с помощью скрипта?

Мне нужно менять текстовый файл .config каждый раз, когда программа не работает так, как я хочу. Я хочу быть в состоянии сделать это в терминале, предпочтительно с псевдонимом и со следующей логикой:

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

Поэтому, когда я ввожу config в терминал, нарушающая строка будет изменена, после чего команда будет будет запущен, после чего линия будет установлена ​​на то, что было в начале

1
задан 6 April 2014 в 21:50

2 ответа

Это очень походит на лейкопластырь и проблема XY , и Вы были бы более обеспеченным выяснением базовой проблемы. Однако, эти команды сделают то, в чем Вы нуждаетесь. Я записал его как функцию оболочки, не псевдоним, но просто добавляю эти строки к Вашему ~/.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
} 

можно тогда выполнить его путем выполнения fix_config.

0
ответ дан 6 April 2014 в 21:50

Вот подробное решение как сценарий Python. Не буквально, что Вы просили, но решение:

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

Для использования его:

  • создают папку в безопасном каталоге для хранения двух версий файлов конфигурации.
  • создают ~/bin папка.
  • копируют код выше в файл и называют его toggle_config (или что-либо, что Вы любите).
  • изменяют строки в headsection к корректным путям, строку и сообщения, которые требуется видеть, когда настройки переключаются
  • , сохранили файл и делают его исполняемым файлом. сохраните его в ~/bin или скопируйте его в /usr/bin для большей безопасности.

После выхода из системы / входят в систему, Вы будете в состоянии переключиться между двумя версиями установки командой

toggle_config

, Вас попросят Вашего пароля, и Вы будете видеть сообщение как это:

enter image description here

, С другой стороны, можно создать .desktop файл с командой и заблокировать ее к средству запуска для быстрого переключения между настройками.

0
ответ дан 6 April 2014 в 21:50

Другие вопросы по тегам:

Похожие вопросы: