Linux中如何保留指定字符串并移除其后所有字符(以.com为例)
解决保留
.com并删除其后字符的问题 你的问题出在sed命令里的正则表达式:.在正则中是匹配任意单个字符的通配符,不是字面意义的点,所以sed 's/.com.*//'实际上是把匹配到的「任意字符+com+后续所有内容」都替换为空,自然就把.com也删掉了。
要实现保留.com并删除其后所有内容,有两种简单的方法:
方法一:直接替换.com及后续内容为.com
把字面量的.用反斜杠转义(\.),然后将\.com.*整体替换为.com:
cat test1.txt | grep .com | sed 's/\.com.*/.com/'
执行后输出结果:
abc.test.com efg.test.com xyz.test.com xab.test.com lmn.test.com com.test.com
方法二:捕获.com并保留
用正则捕获组把.com存起来,替换时只保留捕获的内容:
cat test1.txt | grep .com | sed 's/\(\.com\).*/\1/'
这个命令里,\(\.com\)是捕获组,把匹配到的.com保存下来,\1代表引用第一个捕获组的内容,这样就能保留.com,同时删掉后面的所有字符,效果和方法一完全一致。
另外,你也可以简化管道,把grep和sed合并成一个sed命令,效率更高:
sed -n '/\.com/s/\.com.*/.com/p' test1.txt
-n表示只输出处理过的行,/\.com/用来筛选包含.com的行,后面的替换逻辑和方法一相同。
内容的提问来源于stack exchange,提问作者Tony Jose
相关产品推荐
相关产品推荐

