sed: ファイルから一致するすべてのエントリを削除し、最初の一致がある行をいくつか挿入します。

sed: ファイルから一致するすべてのエントリを削除し、最初の一致がある行をいくつか挿入します。

/etc/ntp.conf設定の自動更新を使用したいとしますsedntp.conf定義された形式を許可リストファイル全体に表示される行に同じキーワードを使用します。たとえば、

# first block occurrences
server 1.1.1.1
server 2.2.2.2

driftfile /var/lib/ntp/drift

# second block of occurrences
server 3.3.3.3
server 4.4.4.4

ntpこれで、5.5.5.5、6.6.6.6、7.7.7.7などのサーバーのリストが更新されました。私が望む結果は次のとおりです。

# first block occurrences
server 5.5.5.5
server 6.6.6.6
server 7.7.7.7

driftfile /var/lib/ntp/drift

# second block of occurrences

これに使用できますかsed?この問題に適したツールですか、それとも別のツールを使用する必要がありますか?

PS:2番目のブロック(または両方のブロック)の発生をコメントアウトすることもオプションかもしれません。

答え1

list.txt次のファイルに新しいサーバーのリストがある場合cwd

sed '/^server/{x;//!r list.txt
d}' /etc/ntp.conf

または、ファイルを使用せずに新しいサーバー名をハードコードしたい場合:

sed '/^server/{x;//!c\
server 1\
........\
server n-1\
server n
d}' /etc/ntp.conf

これは次のように仮定します。コメントされていない項目が 1 つ以上あります。 server ワイヤーあなたのものから/etc/ntp.conf(また、コメント化された行は削除されませんserver。その行も含めるように正規表現を変更できます)。ソースファイルにサーバーエントリがない場合でもこの行を挿入するには(この場合は新しいサーバーがファイルの末尾に追加されます)、次のようにします。

sed '/^server/{x;//!r list.txt
d}
${x;//!r list.txt
x}' /etc/ntp.conf

または必要に応じて同じ条件を使用してくださいc\。練習用に残しておきます。すべてのバックスラッシュがある行を変更するときは、埋め込まれた改行はバックスラッシュにエスケープする必要があることに注意してくださいc\(例のように)。

答え2

sed '
/^server/ d
/first block/a\
server 5.5.5.5\
server 6.6.6.6\
server 7.7.7.7
' /etc/ntp.conf

最初の項目のみを変更します。

# first block occurrences
server 5.5.5.5
server 6.6.6.6
server 7.7.7.7

driftfile /var/lib/ntp/drift

# second block of occurrences

関連情報