![如何在匹配模式后编辑下一行并追加该行(如果不存在)](https://linux22.com/image/8701/%E5%A6%82%E4%BD%95%E5%9C%A8%E5%8C%B9%E9%85%8D%E6%A8%A1%E5%BC%8F%E5%90%8E%E7%BC%96%E8%BE%91%E4%B8%8B%E4%B8%80%E8%A1%8C%E5%B9%B6%E8%BF%BD%E5%8A%A0%E8%AF%A5%E8%A1%8C%EF%BC%88%E5%A6%82%E6%9E%9C%E4%B8%8D%E5%AD%98%E5%9C%A8%EF%BC%89.png)
我正在寻找更改一个文件内容,该内容重复两次,我想在同一文件中的第二个内容中添加额外的行
示例文件
User YOURNAME
IdentityFile ~/.ssh/YOURKEY
.
.
.
User YOURNAME
Installing
Installing
运行脚本后的示例输出
User adminuser
IdentityFile ~/.ssh/id_rsa
.
.
.
User adminuser
IdentityFile ~/.ssh/id_rsa
Installing
Installing
我可以使用以下命令更改user
andYOURKEY
sed
`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#
替换任何实例。最后打印所有行。YOURNAME
adminuser
IdentityFile
print
答案2
部分问题是您的模板不一致:第一次出现有一条IdentityFile
线,而第二条线则不是。您可以通过首先删除现有IdentityFile
行,然后添加所需的行来使其保持一致。
要删除行:
sed -i '/^IdentityFile /d' filename
要添加行,您可以sed
通过以下方式执行此操作匹配线User
,以及追加一条线,例如
sed -e '/^User /'a'\
IdentityFile ~/.ssh/id_rsa' filename