阻止AWK覆盖文件中的下一节

阻止AWK覆盖文件中的下一节,awk,Awk,我有以下AWK脚本更新settings.py文件 原始设置.py DATABASES = { 'default': { 'ENGINE': 'django.db.backends.sqlite3', 'NAME': os.path.join(BASE_DIR, 'db.sqlite3'), } } # Password validation # https://docs.djangoproject.com/en/1.9/ref/settings

我有以下AWK脚本更新settings.py文件

原始设置.py

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.sqlite3',
        'NAME': os.path.join(BASE_DIR, 'db.sqlite3'),
    }
}


# Password validation
# https://docs.djangoproject.com/en/1.9/ref/settings/#auth-password-validators

AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',
    },
    {
        'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',
    },
]
下面是更新数据库部分的AWK脚本,该脚本运行良好

awk 'function pr(sp, k, v){    # prints key-value pair with indentation
         printf "%s\047%s\047: \047%s\047,\n",sp,k,v; 
     }
    BEGIN {
    db_user = ENVIRON["DB_USER"]
    db_pass = ENVIRON["DB_PASS"]
    db_name = ENVIRON["DB_NAME"]
    }
     /sqlite/{ sub(/sqlite[0-9]*/,"mysql",$0) }
     /NAME/{ sp=substr($0,1,index($0,"\047")-1); 
             print sp$1" \047" db_name "\047,"; 
             pr(sp,"USER", db_user); pr(sp,"PASSWORD", db_pass); 
             pr(sp,"HOST","localhost"); pr(sp,"PORT",""); next 
     }1'
AWK脚本之后的new settings.py输出,该脚本还将更新下面的AUTH部分

DATABASES = {
    'default': {
        'ENGINE': 'django.db.backends.mysql',
        'NAME': 'django',
        'USER': 'django',
        'PASSWORD': 'django',
        'HOST': 'localhost',
        'PORT': '',
    }
}


# Password validation
# https://docs.djangoproject.com/en/1.9/ref/settings/#auth-password-validators

AUTH_PASSWORD_VALIDATORS = [
    {
        'NAME': 'django',
        'USER': 'django',
        'PASSWORD': 'django',
        'HOST': 'localhost',
        'PORT': '',
    },

如何阻止AWK覆盖AUTH部分?

应用以下更新:

awk 'function pr(sp, k, v){    # prints key-value pair with indentation
         printf "%s\047%s\047: \047%s\047,\n",sp,k,v; 
     }
    BEGIN {
    db_user = ENVIRON["DB_USER"]
    db_pass = ENVIRON["DB_PASS"]
    db_name = ENVIRON["DB_NAME"]
    }
     /DATABASES/{ f=1 }/AUTH_PASSWORD_VALIDATORS/{ f=0 }
     /sqlite/{ sub(/sqlite[0-9]*/,"mysql",$0) }
     /NAME/ && f{ sp=substr($0,1,index($0,"\047")-1); 
             print sp$1" \047" db_name "\047,"; 
             pr(sp,"USER", db_user); pr(sp,"PASSWORD", db_pass); 
             pr(sp,"HOST","localhost"); pr(sp,"PORT",""); next 
     }1' settings.py

小的修改可以解决您的问题

/AUTH_PASSWORD_VALIDATORS/{ auth=1 }
!auth && /NAME/{