SED: замена записей в / etc / fstab

Если не имеет значения, где в списке параметров находится новый, вы можете

sed '/_configure_flags *:=/ a\
                    --add-module=$(MODULESDIR)/ngx_pagespeed \\
' file
light_configure_flags := \
                    --add-module=$(MODULESDIR)/ngx_pagespeed \
                    $(common_configure_flags) \
                    --with-http_gzip_static_module \
...

Чтобы добавить после строки «common_configure_flags», вы можете:

sed -r '
    # when the line ends with a backslash
    # add the new line with a backslash
    /\$\(common_configure_flags\)[[:blank:]]*\\$/ a\
                    --add-module=$(MODULESDIR)/ngx_pagespeed \\

    # when the line does not end with a backslash,
    # add a backslash, then
    # add the new line without a backslash
    /\$\(common_configure_flags\)[[:blank:]]*$/ {
            s/$/ \\/
            a\
                    --add-module=$(MODULESDIR)/ngx_pagespeed
    }
' file
4
12.11.2018, 18:45
4 ответа

Вы можете использовать awkдля добавления логики добавления строки и columnдля переформатирования конечного выходного файла. Предполагая, что у вас есть права на запись в папки /etc/и /tmp/

tempfile=$(mktemp /tmp/tmpfile.XXXXXXXX)

Это создаст временный файл в пути /tmp/, в который вы можете записать вывод awkи повторно -направить его обратно в исходный файл

awk '$3 ~ "ext[2-4]"{ $4=$4",nodev" }1 ' /etc/fstab | column -t > "$tempfile" && mv -- "$tempfile" /etc/fstab

Часть column -tпросто избыточна и нужна для того, чтобы выходной файл выглядел более читабельным, а не для того, чтобы сделать его беспорядочным и громоздким.

5
27.01.2020, 20:46

Конечно, через десять минут после публикации вопроса я, наконец, смог заставить его делать то, что я хочу, со следующим:

sed -r '/^[^#].*[ \t]+\/[^[:space:]].*ext[2-4]/s/defaults/defaults,nodev/g' /etc/fstab

Если у кого-то есть более понятный или надежный ответ, я бы хотел его услышать. Спасибо!

3
27.01.2020, 20:46

Исключение совпадений сложно поддерживать. Безопаснее сопоставлять только тот раздел, который вы хотите. А для соответствия только одной строке завершающая буква «g» не нужна.

sed -r 's#(/home\s.*defaults)\s#\1,nodev #' /etc/fstab 
0
27.01.2020, 20:46

Вот более простой sedподход:

$ sed -E 's|(\s/\S+\s+ext[2-4]\s+defaults)|\1,nodev|' fstab 
# /etc/fstab
# Created by anaconda on Wed Feb 21 09:37:23 2018
/dev/mapper/vg1-lv_root /                       ext4    defaults        1 1
/dev/mapper/vg1-lv_home /home                   ext4    defaults,nodev        1 2
tmpfs                   /dev/shm                tmpfs   defaults        0 0

Хитрость заключается в том, чтобы найти пробел, за которым следует /и один или несколько не -пробельных символов (\s/\S+), затем ext[2-4], но только если ему предшествует пробел (\s+ext[2-4]), больше пробелов и defaults. Это должно соответствовать только тем случаям, которые вас интересуют. Поэтому, если это действительно так, замените все совпадение самим собой плюсnodev:\1,nodev.

Однако я не уверен, насколько это портативно. -Eдля расширенных регулярных выражений поддерживается многими реализациями sed, но это не POSIX. Для более переносимого подхода вы можете попробовать ту же идею в Perl :

.
$ perl -pe 's|(\s/\S+\s+ext[2-4]\s+defaults)|\1,nodev|' fstab 
# /etc/fstab
# Created by anaconda on Wed Feb 21 09:37:23 2018
/dev/mapper/vg1-lv_root /                       ext4    defaults        1 1
/dev/mapper/vg1-lv_home /home                   ext4    defaults,nodev        1 2
tmpfs                   /dev/shm                tmpfs   defaults        0 0

В обоих случаях для редактирования файла на месте используйте-i:

perl -i -pe 's|(\s/\S+\s+ext[2-4]\s+defaults)|\1,nodev|' fstab 
sed -E 's|(\s/\S+\s+ext[2-4]\s+defaults)|\1,nodev|' fstab 

Или, для BSD или OSXsed:

sed -i '' -E 's|(\s/\S+\s+ext[2-4]\s+defaults)|\1,nodev|' fstab 

Обратите внимание, что вышеприведенное предполагает, что опция defaultsбудет либо единственной, либо, по крайней мере, последней. Они потерпят неудачу, если у вас есть что-то вроде nodev,defaults, например.

5
27.01.2020, 20:46

Теги

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