使用awk替换Apache配置文件中SSLCertificateFile整行内容失败求助
使用awk替换Apache配置文件中SSLCertificateFile整行内容失败求助
嗨,我来帮你捋捋这个问题~
你现在的情况是:用awk替换SSLCertificateFile后面的路径片段成功了,但想直接替换整行却没效果,对吧?先把你的操作场景再理一遍:
成功的操作(替换路径部分)
你之前执行这个命令是有效的,能把/etc/替换成/not_etc/:
[root@checkmk ~]# awk '/^[[:blank:]]*SSLCertificateFile/ {gsub(/\/etc\//, "/not_etc/")} 1' \ /etc/httpd/conf.d/ssl.conf.tmp \ | grep SSLCertificateFile
输出也符合预期:
# Point SSLCertificateFile at a PEM encoded certificate. If SSLCertificateFile /not_etc/pki/tls/certs/localhost.crt # the referenced file can be the same as SSLCertificateFile
失败的操作(尝试替换整行)
但当你想用gsub(/.*\n/, "/etc/pki/public/viridian.city.pem")替换整行时,却完全没生效:
[root@checkmk ~]# awk '/^[[:blank:]]*SSLCertificateFile/ {gsub(/.*\n/, "/etc/pki/public/viridian.city.pem")} 1' \ /etc/httpd/conf.d/ssl.conf.tmp \ | grep SSLCertificateFile
输出还是原来的行:
# Point SSLCertificateFile at a PEM encoded certificate. If SSLCertificateFile /etc/pki/tls/certs/localhost.crt # the referenced file can be the same as SSLCertificateFile
问题原因
其实问题出在awk的行处理逻辑上:awk默认是逐行处理的,每一行读入后会存在$0变量里,而\n换行符并不包含在当前行的内容里——换行符是用来分隔行的标记,所以你用/.*\n/去匹配当前行是匹配不到的,自然不会触发替换。
另外,你写的匹配模式/^[[:blank:]]*SSLCertificateFile/已经精准定位到了目标行(非注释的那行),完全不用再去匹配整行内容了。
正确的解决方法
如果想要直接替换整行内容,不用gsub,直接给$0赋值就行:
awk '/^[[:blank:]]*SSLCertificateFile/ { $0 = " SSLCertificateFile /etc/pki/public/viridian.city.pem" } 1' /etc/httpd/conf.d/ssl.conf.tmp | grep SSLCertificateFile
这样就能把目标行直接替换成你想要的内容了。
或者,如果你想保留行首的空白符,只替换后面的内容,也可以这样写:
awk '/^[[:blank:]]*SSLCertificateFile/ { sub(/SSLCertificateFile.*/, "SSLCertificateFile /etc/pki/public/viridian.city.pem") } 1' /etc/httpd/conf.d/ssl.conf.tmp | grep SSLCertificateFile
这个写法会保留行首的空格,只替换SSLCertificateFile及其后面的所有内容。
备注:内容来源于stack exchange,提问作者gabrielgbs97
相关产品推荐
相关产品推荐

