Преобразование регулярных выражений

Я хочу сделать команду для редактирования /etc/default/grub и изменить таймаут с 10 на 2. Может ли кто-нибудь объяснить, как это сделать?

Вы можете использовать sed , perl и другие инструменты для этого. Вот два примера для sed и perl :


Использование sed :

Начните сухой пробег

 sudo sed 's/^GRUB_TIMEOUT=10$/GRUB_TIMEOUT=2/' /etc/default/grub 

если все в порядке, то

 sudo sed -i 's/^GRUB_TIMEOUT=10$/GRUB_TIMEOUT=2/' /etc/default/grub 

от человека sed :

  -i[SUFFIX], --in-place[=SUFFIX] edit files in place (makes backup if SUFFIX supplied) 

Объяснение:

  • ^GRUB_TIMEOUT=10$

    Визуализация регулярных выражений

    Демоверсия Debuggex

    ^ – утверждение позиции в начале строки

    GRUB_TIMEOUT=10 соответствует символам GRUB_TIMEOUT=10 буквально (с учетом регистра)

    $ – утверждение позиции в конце строки

  • s – s-модификатор: одиночная строка


Использование perl и более общий:

Начните сухой пробег

 perl -pe 's/^(GRUB_TIMEOUT=)[0-9]+$/${1}2/' /etc/default/grub 

если все в порядке, то

 sudo perl -pi -e 's/^(GRUB_TIMEOUT=)[0-9]+$/${1}2/' /etc/default/grub 
  • ^(GRUB_TIMEOUT=)[0-9]+$

    Визуализация регулярных выражений

    Демоверсия Debuggex

Вот общий пример:

 sudo sed -i.bak 's/^\(GRUB_TIMEOUT=\)[0-9]\+$/\12/' /etc/default/grub 

Замените 2 (после \1 ) любым значением, которое вы хотите поместить.

  • s/OLD/NEW/ – шаблон замены для sed .

  • i.bak будет редактировать файл /etc/default/grub на месте, сохраняя исходный файл под резервными /etc/default.grub.bak как /etc/default.grub.bak . Если вы не хотите, чтобы резервная копия просто использовала -i .

  • Мы сопоставили строку, начинающуюся с GRUB_TIMEOUT= (Удерживаем ее внутри группы, чтобы мы могли ссылаться на нее позже) и заканчивается одной или несколькими цифрами ( [0-9]+ ).

  • В разделе замены мы заменили цифры на значение, которое мы хотим поставить, сохраняя ранее подобранную часть (обозначаемую \1 ), как она есть.