如何在带有模式的行尾附加一些与模式组合的字符串

如何在带有模式的行尾附加一些与模式组合的字符串

我想在与 /etc/hosts 文件中的模式匹配的每一行的行尾附加 .com 。

示例文件内容:

127.0.0.1   localhost
1.2.3.4 hostname1 hostname1.xyz hostname1.xyz.  
1.2.3.5 hostname2 hostname2.xyz hostname2.xyz.  
1.2.3.6 hostname3 hostname3.xyz hostname3.xyz.  

我希望它像下面这样:

127.0.0.1   localhost localhost.com
1.2.3.4 hostname1 hostname1.xyz hostname1.xyz. hostname1.xyz.com  
1.2.3.5 hostname2 hostname2.xyz hostname2.xyz. hostname2.xyz.com  
1.2.3.6 hostname3 hostname3.xyz hostname3.xyz. hostname3.xyz.com

有什么sed命令awk可以达到这个效果吗?

答案1

awk

$ awk '$0 = $0 " " $NF ($NF ~ /\.$/ ? "" : ".") "com"' <file
127.0.0.1   localhost localhost.com
1.2.3.4 hostname1 hostname1.xyz hostname1.xyz. hostname1.xyz.com
1.2.3.5 hostname2 hostname2.xyz hostname2.xyz. hostname2.xyz.com
1.2.3.6 hostname3 hostname3.xyz hostname3.xyz. hostname3.xyz.com

答案2

使用 Perl 的解决方案,进行就地编辑

perl -i -pe 's/(\s\S+?)(\.?)\s*$/$1$2$1.com\n/' /etc/hosts
  • \s匹配空白字符
  • \S+?非贪婪匹配 1 个或多个非空白字符
  • \.?贪婪匹配 0 或 1 次。字符(以处理行尾可能出现的额外 . )
  • \s*$贪婪匹配行尾的任何空白字符
  • $1$2保留最后一列,不包括行尾空白字符
  • $1.com\n添加 .com 和换行符

更改-i-i.bkp拥有原始文件的备份(/etc/hosts.bkp)

注意:此正则表达式不起作用,sed因为 BRE/ERE 不支持非贪婪匹配

相关内容