我試圖爲我的CentOS服務器自動化一些事情。爲了實現這種自動化,我需要添加,替換或修改文件行。這可以通過全局替換或替換獨特的行來正常工作。替換其他正則表達式結果的結果
sed -i "s/user \\= apache/user \\= nginx/" file.conf
這將替換user = apache
與user = nginx
工作正常。
但有時我需要在其他正則表達式的結果中替換這些行。例如,文件/etc/php-fpm.d/www.conf
對於一個特定時間包含相同的配置行。 用正則表達式我可以很容易地過濾掉我想替換的部分,但我不知道該怎麼做。
這是文件的一部分:
...
[base]
name=CentOS-$releasever - Base
baseurl=http://centos.mirrors.ovh.net/ftp.centos.org/$releasever/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
exclude=postfix
[updates]
name=CentOS-$releasever - Updates
baseurl=http://centos.mirrors.ovh.net/ftp.centos.org/$releasever/os/$basearch/
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-7
exclude=postfix
[extras]
name=CentOS-$releasever - Extras
...
有了這個表達式:
sed -n "/\[base\]/,/\[updates\]/p" /etc/yum.repos.d/CentOS-Base.repo
我可以從基地】,直到[更新]行。然後我可以修改例如exclude
一行。但是,我怎樣才能將這些行重新導入主文件?
這是我到目前爲止有:
# $BASE contains the lines [base] until [updates]
BASE=`sed -n "/\[base\]/,/\[updates\]/p" /etc/yum.repos.d/CentOS-Base.repo`
# Get te line that holds 'exclude' to the $EXCLUDE parameter
EXCLUDE=`echo "$BASE" | grep "exclude"`
# Modify EXCLUDE
EXCLUDE="$EXCLUDE, dovecot"
# Replace old exclude line in $BASE variable with new one
BASE=`sed "s/^exclude.*/$EXCLUDE/g" $BASE`
# Put $BASE back into /etc/yum.repos.d/CentOS-Base.repo
# ???
在這個腳本中,我試圖用多個命令這是很好的實現這一點。如果只有一個替換表達式,這也會很好。但這當然不是必須的。
刪除'-n'開關和'p'命令,只需在您的正則表達式定義的地址範圍後添加's/search/replace /'..參見http://stackoverflow.com/documentation/sed/3120/地址和地址範圍#t = 201609211113556376005爲例 – Sundeep