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

时间:2014-10-29 14:56:39

标签: linux bash awk grep

我有一个名为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

我该怎么办?

1 个答案:

答案 0 :(得分:20)

使用awk:

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

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

使用sed

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

这会捕获. + text + end of line的最后一个块,并将其替换为空。也就是说,它将其删除。

revcut

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

rev反转该行,以便cut可以从第二个字打印到结尾。然后,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