server {
/etc/nginx/nginx.conf で最初に一致する文字列の前に次の行を挿入する必要があります (変数置換後)。
変える:
website=www.hello.com
ラインブロック:
server {
# Permanent redirect to www
server_name ${website:4};
rewrite ^/(.*)$ http://$website/$1 permanent;
}
変数置換後に挿入する行ブロックは、次のようにする必要があります。
server {
# Permanent redirect to www
server_name hello.com;
rewrite ^/(.*)$ http://www.hello.com/$1 permanent;
}
私が試した次の試みには2つの問題があります。
問題1:コードは、最初のパターンだけでなく、各(複数の)一致パターンの前に行ブロックを追加します。
問題2:変数の値website
が置き換えられません。www.hello.com
cat myattempt.sh
awk '
/server {/ {
print "server {"
print "# Permanent redirect to www"
print "server_name ${website:4};"
print "rewrite ^/(.*)$ http://$website/$1 permanent;"
print "}"
}
{ print }
' /etc/nginx/nginx.conf > /etc/nginx/nginx.conf.tmp
mv /etc/nginx/nginx.conf.tmp /etc/nginx/nginx.conf
私の試みをテストするには/etc/nginx/nginx.conf
:
Cat/etc/nginx/nginx.conf
http
{
# server {
}
server {
}
}
myattempt.shの実行
現在の出力:cat /etc/nginx/nginx.conf
http
{
server {
# Permanent redirect to www
server_name ${website:4};
rewrite ^/(.*)$ http://$website/$1 permanent;
}
# server {
}
server {
# Permanent redirect to www
server_name ${website:4};
rewrite ^/(.*)$ http://$website/$1 permanent;
}
server {
}
}
予想出力:
Cat/etc/nginx/nginx.conf
http
{
server {
# Permanent redirect to www
server_name hello.com;
rewrite ^/(.*)$ http://www.hello.com/$1 permanent;
}
# server {
}
server {
}
}
何か提案してもらえますか?
ベストアンサー1
これはおそらくあなたが望むものです:
$ cat tst.sh
#!/usr/bin/env bash
website=www.hello.com
new='
server {
# Permanent redirect to www
server_name '"${website:4}"';
rewrite ^/(.*)$ http://'"$website"'/$1 permanent;
}
'
awk -v new="$new" '
/server *\{/ && !f++ {
print new
}
{ print }
' "${@:-}"
$ ./tst.sh file
http
{
server {
# Permanent redirect to www
server_name hello.com;
rewrite ^/(.*)$ http://www.hello.com/$1 permanent;
}
# server {
}
server {
}
}
同じ名前のシェル変数でawk変数を入力すると-v
エスケープシーケンスが解釈されるため、同じ文字列はリテラルタブと改行文字になります。これが問題の場合、またはを使用してシェル変数の値を取得します。new
\t
\n
ENVIRON[]
ARGV[]
awkスクリプトでシェル変数を使用する方法。