![如何使用 awk/sed 在两个匹配的文本之间添加文本/字符串](https://linux22.com/image/1606313/%E5%A6%82%E4%BD%95%E4%BD%BF%E7%94%A8%20awk%2Fsed%20%E5%9C%A8%E4%B8%A4%E4%B8%AA%E5%8C%B9%E9%85%8D%E7%9A%84%E6%96%87%E6%9C%AC%E4%B9%8B%E9%97%B4%E6%B7%BB%E5%8A%A0%E6%96%87%E6%9C%AC%2F%E5%AD%97%E7%AC%A6%E4%B8%B2.png)
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
)