私のCentOSサーバーのいくつかを自動化しようとしています。この自動化では、ファイル行を追加、置換、または変更する必要があります。これは、一意の行をグローバル置換または置換することで正常に動作します。他の正規表現の結果の置換
sed -i "s/user \\= apache/user \\= nginx/" file.conf
これは正常に動作しますuser = nginx
とuser = apache
を置き換えます。
しかし時には、私は他の正規表現の結果の中でこれらのような行を置き換える必要があります。たとえば、ファイル/etc/php-fpm.d/www.conf
には、同じ設定行が1つのサルバル時間に含まれています。 正規表現を使用すると、私は置換えをしたい部分を簡単にフィルタリングできますが、それを行う方法はわかりません。 [アップデート]まで、私は[ベース]から行を取得することができます
sed -n "/\[base\]/,/\[updates\]/p" /etc/yum.repos.d/CentOS-Base.repo
:この正規表現で
...
[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
...
:
これは、ファイルの一部です。次に、例えば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
# ???
私は罰金である複数のコマンドでこれを達成しようとしています。これに代わる式が1つだけあればいいでしょう。しかし、もちろんその必要はありません。
'-n'スイッチと' p'コマンドを削除するには、正規表現で定義された 's/search/replace /'のアドレス範囲を追加するだけです。http://stackoverflow.com/documentation/sed/3120/を参照してください。アドレスとアドレスの範囲#t = 201609211113556376005例 – Sundeep