Добавьте строки к файлу с командами

Я должен добавить:

user_xattr,acl,barrier=1

в мой/etc/fstab файл. Существует ли способ сделать это через с помощью сценария оболочки?

Я только хочу отредактировать'/'смонтируйтесь.

Вот то, что я имею, прежде чем я вручную отредактирую его:

UUID=eb287d10-60a8-4a9a-9148-5f907fc7a8be / ext4 errors=remount-ro 0 1

Вот то, на что это похоже после того, как я вручную добавляю строки:

UUID=eb287d10-60a8-4a9a-9148-5f907fc7a8be / ext4 user_xattr,acl,barrier=1,errors=remount-ro 0 1

Я знаю что sed -i команда не будет работать здесь, потому что она только добавляет строки...

Также сценарий быть выполненным на нескольких компьютерах, таким образом, это должно смочь "знать", что UUID будет отличаться.

3
задан 5 April 2014 в 04:22

2 ответа

На самом деле, sed мог работать отлично, но здесь еще некоторые варианты также:

1. sed

sudo sed -i.old -r '/[ \t]\/[ \t]/{s/(ext4[\t ]*)([^\t ]*)/\1\2,user_xattr,acl,barrier=1/}' /etc/fstab

Объяснение:

  • -i.old : Отредактируйте файл на месте и создайте fstab.old как резервное копирование исходного файла перед изменениями.
  • -r : Включите расширенные регулярные выражения.
  • /[ \t]\/[ \t]/{} : Если эта строка соответствует a / окруженный пространством или вкладкой (если эта строка описывает / точка монтирования).
  • s/(ext4[\t ]*)([^\t ]*)/\1\2,user_xattr,acl,barrier=1/ : s/pat/replacement/ оператор замены, он заменит pat с replacement. Здесь, мы соответствуем ext4 и любой после пространства или вкладки (должен был привязать соответствие, если Ваши файловые системы не являются ext4, необходимо будет изменить это), и затем получающий (это - то, что круглые скобки делают), самый длинный фрагмент непробельных символов после этого. Другими словами, получая поле опций fstab. Мы затем заменяем тех, которые имеют \1 (первый полученный шаблон), \2 (3nd capturef шаблон, исходные опции) плюс дополнительные опции Вы хотели добавить.

2. Perl

sudo perl -i.old -pane 's/$F[3]/$F[3],user_xattr,acl,barrier=1/ if $F[1] eq "/"' /etc/fstab

Объяснение:

  • -i.old : Снова, это заставит файл быть отредактированным на месте и названное резервное копирование fstab.old будет создан.
  • -pane : -p средства печатают каждую строку, -a автоматически разделения вводят строки в поля на пробеле, и сохраняет их как массив @F. -n чтение средств линию за линией и -e позволяет Вам передать сценарий командной строке.
  • Фактический сценарий добавит дополнительные опции к текущему значению 4-го поля ($F[3], 1-е поле $F[0]) только если второе поле ($F[1], точка монтирования), /.

3. awk

sudo cp /etc/fstab /etc/fstab.old && 
 awk '($2=="/"){$4=$4",user_xattr,acl,barrier=1"}1;' /etc/fstab.old | sudo tee /etc/fstab

Объяснение:

Большинство версий awk не позволяйте на месте редактировать так первую команду, создаст резервную копию. awk затем проверит, ли 2-е поле / и если так, добавит обязательный текст к 4-му полю, опциям. 1; awk сокращение от "печати строка". sudo tee просто прием, чтобы позволить печатать к /etc/fstab так как простое перенаправление не будет работать с sudo.

4. чистый удар

sudo cp /etc/fstab /etc.fstab.old
while read fs mp ty op du pa; do 
    [[ $mp = "/" ]] && op="user_xattr,acl,barrier=1,""$op"; 
    printf "%s %s %s %s %s %s\n" "$fs" "$mp" "$ty" "$op" "$du" "$pa"; 
done < /etc/fstab.old | sudo tee /etc/fstab

Объяснение

  • while read fs mp ty op du pa; do ...; done < /etc/fstab : Считайте каждую fstab строку и разделите на соответствующие поля.
  • [[ $mp = "/" ]] && op="user_xattr,acl,barrier=1,""$op"; если точка монтирования /, добавьте дополнительные опции к $op.
  • printf просто печать каждая строка правильно.
12
ответ дан 17 November 2019 в 19:11

sed -i не используется [только 1 115] для добавления строк, как Вы сказали. Это может использоваться во многих других случаях. И в Вашем случае любят, следуйте:

str="/[[:space:]]*ext4[[:space:]]*errors=remount-ro[[:space:]]*0[[:space:]]*1"
sed -i.bak "s#$str#/ ext4 user_xattr,acl,barrier=1,errors=remount-ro 0 1#" /etc/fstab

Как это $str, который равен с чем-то как / ext4 errors=remount-r 0 1 (где каждое пространство может быть любой группой пробелов <tab> и <space>) будет заменен / ext4 user_xattr,acl,barrier=1,errors=remount-ro 0 1 в /etc/fstab файл.

класс [:space:] (которые соответствуют пробельным символам <tab> и <space>) определен POSIX, таким образом, у Вас не должно быть проблем в использовании его ни в какой оболочке.

1
ответ дан 17 November 2019 в 19:11

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

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