Оказывается, подход (, инициирующий переменную «$filesystem _root _dir» в верхней части файла и присваивающий ей одно значение для каждой конфигурации ),:
nginx: [emerg] "set" directive is not allowed here in /etc/nginx/nginx.conf:1
)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
Я думал о генераторе шаблонов, но затраты намного превышают выгоды, поэтому я либо оставлю файлы немного другими в будущем.
Кажется, вам просто нужно избавиться от пути к файлу.
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!
С помощью 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}
. Действие по умолчанию в awk
— print
, здесь 1
в конце. Наконец, результат сохраняется в файле outputfile
.
Хотя обычно это не рекомендуется, вот цикл оболочки для решения проблемы:
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
, это может привести к неправильному (удалению всего пути ), если путь был именем каталога, записанным с конечным /
.