Unix环境下如何从abc.txt移除.tar行并保留.tar.gz行?
解决方法:移除含.tar后缀的行,保留.tar.gz的行
嘿,我来帮你搞定这个问题!你之前执行的sed -i "/*.tar/d" abc.txt没成功,主要是两个关键问题:
- 混淆了shell通配符和正则表达式:sed使用的是正则表达式,而
*在正则里表示“匹配前面字符0次或多次”,不是shell里的“任意字符”;而且你没转义.——正则里.代表任意单个字符,直接写.tar会匹配比如xtar、atar这类字符串,不是你要的.tar后缀。 - 没有限定行尾匹配:如果只写
.tar,会误匹配.tar.gz里的.tar部分,导致把你想保留的行也删掉了。
正确的sed命令
用这个命令就能精准删除仅以.tar结尾的行,保留.tar.gz的行:
sed -i '/\.tar$/d' abc.txt
解释一下每个部分:
\/\.tar$/:正则表达式,\.转义后表示实际的点号,$表示匹配行的末尾,整体意思是“匹配行尾是.tar的行”d:sed的删除命令,把匹配到的行删掉-i:直接修改原文件(如果是macOS的sed,需要写成sed -i '' '/\.tar$/d' abc.txt,注意空参数)
替代方法:用grep反向匹配
如果你对sed不太熟悉,也可以用grep来实现:
grep -v '\.tar$' abc.txt > temp.txt && mv temp.txt abc.txt
-v:反向匹配,输出不匹配指定模式的行- 把结果临时存到temp.txt,再覆盖原文件(避免直接重写原文件导致的问题)
测试一下你的示例内容,执行命令后,abc.txt里会剩下:
HUW_3356_DLM4_00_00.tar.gz、HUW_3359_DLM4_01_00.tar.gz、HUW_3360_DLM4_02_00.tar.gz
完美符合你的需求!
内容的提问来源于stack exchange,提问作者Sumit
相关产品推荐
相关产品推荐

