如何在匹配模式后编辑下一行并追加该行(如果不存在)

如何在匹配模式后编辑下一行并追加该行(如果不存在)

我正在寻找更改一个文件内容,该内容重复两次,我想在同一文件中的第二个内容中添加额外的行

示例文件

User YOURNAME
IdentityFile ~/.ssh/YOURKEY

.
.
.
User YOURNAME
Installing
Installing

运行脚本后的示例输出

User adminuser
IdentityFile ~/.ssh/id_rsa

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

我可以使用以下命令更改userandYOURKEYsed

`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/任何匹配的行IdentityFile。将会用、换行符和行s#YOURNAME#adminuser\nIdentityFile ~/.ssh/id_rsa#替换任何实例。最后打印所有行。YOURNAMEadminuserIdentityFileprint

答案2

部分问题是您的模板不一致:第一次出现一条IdentityFile线,而第二条线则不是。您可以通过首先删除现有IdentityFile行,然后添加所需的行来使其保持一致。

要删除行:

sed -i '/^IdentityFile /d' filename

要添加行,您可以sed通过以下方式执行此操作匹配线User,以及追加一条线,例如

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

相关内容