Все зависит от того, используете ли вы Amazon Linux 1 (2018.03 )или Amazon Linux 2.
Проверьте файл /etc/os-release
, чтобы узнать, какой из них у вас есть.
/etc/os-release
содержит:
NAME="Amazon Linux AMI"
VERSION="2018.03"
ID="amzn"
ID_LIKE="rhel fedora"
VERSION_ID="2018.03"
PRETTY_NAME="Amazon Linux AMI 2018.03"
ANSI_COLOR="0;33"
CPE_NAME="cpe:/o:amazon:linux:2018.03:ga"
HOME_URL="http://aws.amazon.com/amazon-linux-ami/"
Репозиторий AWS для Amazon Linux 1 содержит только nginx версии 1.14.1:
0» yum info nginx
Loaded plugins: priorities, update-motd, upgrade-helper
1070 packages excluded due to repository priority protections
Available Packages
Name : nginx
Arch : x86_64
Epoch : 1
Version : 1.14.1
Release : 2.34.amzn1
/etc/os-release
содержит:
NAME="Amazon Linux"
VERSION="2"
ID="amzn"
ID_LIKE="centos rhel fedora"
VERSION_ID="2"
PRETTY_NAME="Amazon Linux 2"
ANSI_COLOR="0;33"
CPE_NAME="cpe:2.3:o:amazon:amazon_linux:2"
HOME_URL="https://amazonlinux.com/"
На момент написания AL2 имел только nginx 1.12.2:
» amazon-linux-extras list | grep nginx
4 nginx1.12 available [ =1.12.2 ]
Установить стандартную версию очень просто. Для AL1 выполните yum install nginx
, а для AL2 выполните amazon-linux-extras install nginx1.12
.
Чтобы запустить новейшую версию nginx, вам, вероятно, потребуется скомпилировать ее самостоятельно или попросить AWS обновить свои пакеты. Чтобы скомпилировать nginx самостоятельно, см. отличные инструкции Lee Benson здесь:https://stackoverflow.com/questions/37082406/how-to-install-nginx-1-9-15-on-amazon-linux-disto
Tried to find the reason why open curly brace doesn't match at beginning but no clues.
По умолчанию sed
работает с одной строкой за раз, поэтому строки, которые вы читаете, не могут содержать \n
внутри себя. Поскольку вы используете GNU sed
, if предлагает опцию -z
, которая позволяет вам работать с блоками текста, разделенными символами NUL (\0
). Единственное, что вам нужно изменить в своей команде, это добавить опцию -z
:
sed -z "s|sub feature_get_web_php_mode\n{\n|&return 'fcgid';\n|"
Просто имейте в виду, что я ожидаю, что во входном файле не будет символа NUL (он выглядит как обычный текстовый файл ), поэтому он будет полностью загружен в память, чтобы sed
мог его обработать (что, вероятно, безвредно, так как это программный файл ).
Если ваш файл действительно слишком большой, вы можете попробовать эту альтернативную версию:
sed "/^sub feature_get_web_php_mode\$/ { N; s|\n{|&\nreturn 'fcgid';|; }"
Для справки: приведенная ниже версия строго соответствует Posix:
sed "/^sub feature_get_web_php_mode\$/ { N; s|\n{|&\\
return 'fcgid';|; }"
Чтобы изменить текст
sub feature_get_web_php_mode
{
my ($d) = @_;
my $server = &find_domain_server($d);
в
sub feature_get_web_php_mode
{
return 'fcgid';
my ($d) = @_;
my $server = &find_domain_server($d);
путем сопоставления строки sub feature_get_web_php_mode
, за которой в следующей строке следует {
, а затем вставки новой строки
return 'fcgid';
тебе придется
sed '/^sub feature_get_web_php_mode$/ { N; /\n{$/ a\
'"return 'fcgid'"';
}' file
Это находит строку, которая точно соответствует sub feature_get_web_php_mode
. Как только это найдено, следующая строка добавляется к входному буферу с символом новой строки в -между ними с помощью команды N
. Затем, если шаблон \n{$
совпадает, то строка, которая была прочитана с помощью N
, является единственным символом {
, и можно добавить новую строку.
Новая строка добавляется командой a
. Команда a
выглядит как
a\
text to be added
Поскольку текст, который мы хотим добавить, содержит одинарные кавычки, а наш скрипт sed
заключен в одинарные кавычки, мы временно отказываемся от одинарных кавычек программы sed
, чтобы добавить текст в двойных кавычках.
В качестве альтернативы, двойные -кавычки всего выражения (не забудьте экранировать \
после a
здесь):
sed "/^sub feature_get_web_php_mode$/ { N; /\n{$/ a\\
return 'fcgid';
}" file
Используя GNU sed
, вы можете сделать это следующим образом:
sed -e '/^sub feature_get_web_php_mode$/ { N; /\n{$/ a \' -e "return 'fcgid';" -e '}' file
Другие sed
реализации, возможно, тоже смогут выполнять это, но могут не вставлять новую строку после добавленной строки.
Другой способ сделать это — подготовить файл исправления:
diff -u file.old file.new >file.patch
Это может привести к тому, что файл исправления будет выглядеть как
--- file.old Wed May 12 22:44:00 2021
+++ file.new Wed May 12 22:44:15 2021
@@ -1,4 +1,5 @@
sub feature_get_web_php_mode
{
+return 'fcgid';
my ($d) = @_;
my $server = &find_domain_server($d);
Чтобы применить это к некоторому файлу, создайте новый файл с внесенными изменениями:
patch -o somefile.patched somefile <file.patch
Без -o somefile.patch
изменения применяются непосредственно к somefile
, а оригинал копируется как somefile.orig
.