Используйте команду «sed», чтобы найти шаблон, а затем заменить все после этого с помощью Python

Оказывается, подход (, инициирующий переменную «$filesystem _root _dir» в верхней части файла и присваивающий ей одно значение для каждой конфигурации ),:

  • Запрещено (выбрасывает фатальный:nginx: [emerg] "set" directive is not allowed here in /etc/nginx/nginx.conf:1)
  • обескуражен командой Nginx:
Variables should not be used as template macros. Variables are evaluated in the run-time during the processing of each request, so they are rather costly compared to plain static configuration. Using variables to store static strings is also a bad idea. Instead, a macro expansion and "include" directives should be used to generate configs more easily and it can be done with the external tools, e.g. sed + make or any other common template mechanism. 

http://nginx.org/en/docs/faq/variables_in_config.html

Я думал о генераторе шаблонов, но затраты намного превышают выгоды, поэтому я либо оставлю файлы немного другими в будущем.

0
01.02.2021, 21:36
3 ответа

Кажется, вам просто нужно избавиться от пути к файлу.

sed -e 's,file_name=.*/,file_name=,'  < file > newfile

должен помочь... он занимает в каждой строке, содержащей file_name=.../..., всю часть между =и последним/вне строки.

Если вы хотите редактировать «на месте» и использовать GNU sed, вы можете:

sed -i -e 's,file_name=.*/,file_name=,' file # This modifies the file. Back it up first!
4
18.03.2021, 22:33

С помощью awkвы можете напечатать два поля, первое и последнее в этом случае, когда в строке есть {MY_DIR}, если ранее вы установили FSкак [/=].

$ awk -v FS='[/=]' -v OFS='=' '/{MY_DIR}/ {print $1, $NF;next} 1' file > outputfile
input0_bpp=8
input0_is_padding_enable=0
input0_task0_file_name=cam_1024x512.bin
output0_bpp=8
output0_is_padding_enable=0
output0_task0_file_name=cam_1024x512.bin

Условие здесь /{MY_DIR}/, а действие {print $1, $NF;next}. Действие по умолчанию в awkprint, здесь 1в конце. Наконец, результат сохраняется в файле outputfile.

3
18.03.2021, 22:33

Хотя обычно это не рекомендуется, вот цикл оболочки для решения проблемы:

while IFS='=' read -r key value; do
    case $key in (*_file_name) value=$( basename "$value" ); esac
    printf '%s=%s\n' "$key" "$value"
done <file

Для каждой строки в файле с именем fileсчитывается бит до =в переменную key, а все после =— в переменную value.

Если значение $keyзаканчивается строкой _file_name, значение изменяется утилитой basename, которая возвращает в своем аргументе только часть имени файла пути. Если у вас нет путей, заканчивающихся на /, вы можете использовать ${value##*/}вместо полной подстановки команд.

Затем вызов printfвыводит ключ с его возможно измененным значением, с =в -между ними.


Сsed:

sed 's|^\([^=]*_file_name=\).*/|\1|' file

В каждой строке, где данное регулярное выражение совпадает, удаляется бит между первым =и последним /символами. Это, скорее всего, приведет к неправильному результату, если путь после =будет именем пути к каталогу, записанному с /в конце.


awkможно использовать так:

awk -F '=' 'BEGIN { OFS = FS } $1 ~ /^[^=]*_file_name$/ { sub("=.*/", "=", $0) }; 1' file

Это более или менее прямое преобразование исходного цикла оболочки в awkпрограмму.

При чтении строк с полями, разделенными =-, sub()запускается всякий раз, когда первое поле соответствует выражению, аналогичному тому, что используется в варианте sedвыше. Вызов sub()удаляет все, начиная с первого =в строке до последнего /включительно.

Как и в случае с вариантом sed, это может привести к неправильному (удалению всего пути ), если путь был именем каталога, записанным с конечным /.

0
18.03.2021, 22:33

Теги

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