微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

linux – 删除bash中最后一个点的所有文本

我有一个名为test.txt的文件,其中包含:

abc.cde.ccd.eed.12345.5678.txt
abcd.cdde.ccdd.eaed.12346.5688.txt
aabc.cade.cacd.eaed.13345.5078.txt
abzc.cdae.ccda.eaed.29345.1678.txt
abac.cdae.cacd.eead.18145.2678.txt
aabc.cdve.cncd.ened.19945.2345.txt

如果我想删除一个之外的所有内容.喜欢:

cde.ccd.eed.12345.5678.txt
cdde.ccdd.eaed.12346.5688.txt
cade.cacd.eaed.13345.5078.txt
cdae.ccda.eaed.29345.1678.txt
cdae.cacd.eead.18145.2678.txt
cdve.cncd.ened.19945.2345.txt

然后我会做

for i in `cat test.txt`; do echo ${i#*.}; done

但如果我想在最后一个之后删除所有内容.喜欢:

abc.cde.ccd.eed.12345.5678
abcd.cdde.ccdd.eaed.12346.5688
aabc.cade.cacd.eaed.13345.5078
abzc.cdae.ccda.eaed.29345.1678
abac.cdae.cacd.eead.18145.2678
aabc.cdve.cncd.ened.19945.2345

我该怎么办?

解决方法:

用awk:

awk 'BEGIN{FS=OFS="."} NF--' file

如果没有空行,这是有效的.它将输入和输出字段分隔符设置为点.然后,减少一个字段的数量,以便保留最后一个.然后它执行认的awk操作:{print $0},即打印该行.

用sed:

sed 's/\.[^.]*$//' file

这抓住了最后一块.文本行结束并替换为空.也就是说,它删除它.

随着转速和削减:

rev file | cut -d'.' -f2- | rev

rev反转该行,以便剪切可以从第二个字打印到结尾.然后,转回以获得正确的输出.

用bash:

while ISF= read -r line
do
  echo "${line%.*}"
done < file

这执行一个字符串操作,包括从变量$line内容的末尾替换.*的最短匹配.

用grep:

grep -Po '.*(?=\.)' file

预览以打印最后一个点之前的内容.

所有人都回归:

abc.cde.ccd.eed.12345.5678
abcd.cdde.ccdd.eaed.12346.5688
aabc.cade.cacd.eaed.13345.5078
abzc.cdae.ccda.eaed.29345.1678
abac.cdae.cacd.eead.18145.2678
aabc.cdve.cncd.ened.19945.2345

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。

相关推荐