如何使用 awk/sed 在两个匹配的文本之间添加文本/字符串

如何使用 awk/sed 在两个匹配的文本之间添加文本/字符串
In Below file.

nsswitch.conf

hosts:          files mdns4_minimal [NOTFOUND=return] dns myhostname
networks:       files
protocols:      db files
services:       db files sss
ethers:         db files
rpc:            db files
netgroup:       nis sss ldap
sudoers: files sss

i want to add text 'ldap' in last line between 'files' and 'sss' which should give an output file as below 

nsswitch.conf

hosts:          files mdns4_minimal [NOTFOUND=return] dns myhostname
networks:       files
protocols:      db files
services:       db files sss
ethers:         db files
rpc:            db files
netgroup:       nis sss ldap
sudoers: files ldap sss

现在我正在使用 sed 更改行。

sed -i '/sudoers: files sss/c sudoers: files ldap sss' nsswitch.conf

有没有更好的方法可以达到同样的效果?

答案1

awk 解决方案是

awk '$1 ~ /sudoers/ && $0 !~/ldap/ { $2 = $2 " ldap" ;} {print ;} ' nsswitch.conf > nsswith.txt
cp nsswith.txt nsswith.conf

在哪里

  • $1 ~ /sudoers/ && $0 !~/ldap/选择以 sudoers 开头的行,不包含 ldap
  • { $2 = $2 " ldap" ;}在第三个位置插入 ldap
  • {print ;}打印该行(修改后的行和其他行)

请注意 :

  • 通常awk无法进行内联编辑,因此您必须依赖于临时文件。
  • sudoers:awk 解决方案可以处理空格问题。(例如,如果和之间有一个或多个空格或制表符file

相关内容