パターンを一致させた後に次の行を編集し、存在しない場合はその行を追加する方法

パターンを一致させた後に次の行を編集し、存在しない場合はその行を追加する方法

2回繰り返されるファイルの内容を変更しようとしており、同じファイルの2番目の内容に追加の行を追加したいと思います。

サンプルファイル

User YOURNAME
IdentityFile ~/.ssh/YOURKEY

.
.
.
User YOURNAME
Installing
Installing

スクリプト実行後のサンプル出力

User adminuser
IdentityFile ~/.ssh/id_rsa

.
.
.
User adminuser
IdentityFile ~/.ssh/id_rsa
Installing
Installing

次のコマンドを変更しuserて使用できますYOURKEYsed

`sed- i s/"YOURNAME/adminuser"/g /root/.ssh/config`
`sed -i 's/YOURKEY/id_rsa/g' ff1`

IdentityFile ~/.ssh/id_rsaただし、次の行を挿入できません。

編集済み

追加情報は、****User adminuser行の先頭にスペースがあることです。これらのファイルは毎日同期されるため、IdentityFile行を削除することはできません。同期後に置き換えられます。

最終編集は必要に応じて行われました。

perl -i -ne 'next if /IdentityFile/; 
            s#YOURNAME#adminuser\n    IdentityFile ~/.ssh/id_rsa#; 
            print' filename

答え1

すべてのケースを削除しIdentityFileて明示的に再追加してください。

$ perl -i -ne 'next if /IdentityFile/; 
            s#YOURNAME#adminuser\nIdentityFile ~/.ssh/id_rsa#; 
            print' file
$ cat file
User adminuser
IdentityFile ~/.ssh/id_rsa

.
.
.
User adminuser
IdentityFile ~/.ssh/id_rsa
Installing
Installing

next if /IdentityFile/一致する行をスキップしますIdentityFiles#YOURNAME#adminuser\nIdentityFile ~/.ssh/id_rsa#すべてのインスタンスは、 newline および line に置き換えられます。最後に、すべての行を印刷します。YOURNAMEadminuserIdentityFileprint

答え2

問題の一部は、テンプレートが一貫性がないことです。持つ1IdentityFile行、2行目はいいえ。まず、既存のIdentityFile行を削除してから、必要な行を追加して一貫性を維持できます。

行を削除するには:

sed -i '/^IdentityFile /d' filename

行を追加するには、sed次のようにします。マッチラインUser追加たとえば、1行

sed -e '/^User /'a'\
IdentityFile ~/.ssh/id_rsa' filename

関連情報