Изhttps://www.openbsd.org/faq/faq10.html#Patches:
Upgrade your system to -current and use binary packages
Binary packages for -current snapshots are rebuilt on a regular basis, and these new packages will include any security fixes that were committed. Simply call pkg_add(1) with the -u flag after picking a mirror to get the new files.
Обязательно обновляйте базовую систему.
Ваш критерий, по-видимому, соответствует :любому количеству прописных букв или знаков подчеркивания, содержащихся между ${
и }
.
gawk
может работать для этого самостоятельно,или grep
может упростить часть сопоставления шаблонов (, но впоследствии потребуется дополнительное форматирование ).
awk
:gawk -v 'RS=[$]{' -F '}' '$1 ~ /^[A-Z_]+$/ && !a[$1]++ {printf "%s=\n", $1}' FILE
RS=[$]{
, он разделит ввод FILE
на записи везде, где встречается шаблон ${
}
— теперь можно проверить первое поле каждой записи, чтобы увидеть, соответствует ли оно другим вашим критериям :ничего, кроме одного -или -больше из[A-Z_]
&& !a[$1]++
удалит дубликаты =
в конец каждой строки, чтобы соответствовать желаемому результату ${
— это означает, что если ваш файл начинается с[A-Z_]+}
(маловероятно )- эти прописные буквы/символы подчеркивания будут "совпадать" и будут напечатаны в первой строке вывода grep
+ форматирование grep
возможно, легче понять (благодаря опции -o
/ --only-matching
):
grep -o '${[A-Z_]\+}' FILE
sed
может сделать это :например. grep -o '${[A-Z_]\+}' FILE | sed 's/${\(.*\)}/\1=/'
sort -u
, чтобы сделать это, или, альтернативно, один раз через awk:grep -o '${[A-Z_]\+}' FILE | awk -F '[{}]' '!a[$0]++{printf "%s=\n", $2}'
Вот что я в итоге сделал:
cat file | grep -o '${\w*}' | sed -e 's|${||g' -e 's|}|=|g'
DB_HOST=
DB_PORT=
WEB_HOST=
WEB_PATH=
Кажется, это работает достаточно хорошо, даже если выглядит некрасиво!
Или другой метод (, модифицированный по сравнению сhttps://unix.stackexchange.com/a/13467/229729):
cat file | sed -n -e 's/.*${\(\w\+\)}.*/\1=/p'