Сопоставьте фигурную скобку с новой строкой

Все зависит от того, используете ли вы Amazon Linux 1 (2018.03 )или Amazon Linux 2.

Проверьте файл /etc/os-release, чтобы узнать, какой из них у вас есть.

Амазон Линукс 1

/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

Амазон Линукс 2

/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

2
25.05.2021, 12:43
2 ответа

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';|; }"
3
28.07.2021, 11:33

Чтобы изменить текст

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.

3
28.07.2021, 11:33

Теги

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