我有一个名为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
我该怎么办?
答案 0 :(得分:20)
使用awk:
awk 'BEGIN{FS=OFS="."} NF--' file
如果没有空行,这是有效的。它将输入和输出字段分隔符设置为点.
。然后,减少一个字段的数量,以便保留最后一个字段。然后它执行默认的awk
操作:{print $0}
,即打印该行。
使用sed
:
sed 's/\.[^.]*$//' file
这会捕获.
+ text
+ end of line
的最后一个块,并将其替换为空。也就是说,它将其删除。
rev
和cut
:
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