在bash

时间:2016-03-07 01:15:11

标签: bash

假设我有一个字符串文件名aa.bb.cc.xx.txt 我想删除之间的第一个内容。和。 (。删除.xx)在.txt之前有aa.bb.cc.txt

我不想使用rev,cut和rev,因为它使用3个命令

echo 'aa.bb.cc.xx.rpm' |rev | cut -d '.' --complement -s -f 2 |rev

使用bash还有更好的解决方案吗? 感谢

3 个答案:

答案 0 :(得分:1)

如果您知道该文件以.txt结尾,您也可以将其删除,然后重新开启。

$ oldname=aa.bb.cc.xx.txt
$ echo "${oldname%.*.txt}.txt"
aa.bb.cc.txt

%.*.txt删除与模式.*.txt匹配的最短字符串(在本例中为.xx.txt)。

如果扩展名可以是任意字符串,您可以通过删除扩展名作为前缀,然后将其恢复来保存它。

$ echo "${oldname%.*.*}.${oldname##*.}"

##*.删除以.结尾的最长匹配前缀,在本例中为aa.bb.cc.xx.。两个运营商都需要删除用于分隔匹配前缀或后缀的.,这就是您需要在两次扩展之间明确添加它的原因。

答案 1 :(得分:0)

您可以按如下方式使用sed

$ echo "aa.bb.cc.xx.txt" | sed "s/.[a-zA-Z].txt/txt/g"
aa.bb.cc.txt

答案 2 :(得分:0)

如果您想要适用于任何扩展程序的常规sed -e '/?!(rpms$)/{N;s/\n//}' filename 解决方案,您可以执行以下操作:

sed