5

我有一个目录 ( /path/to/local) 中的文件名列表。我想从所有这些文件名中删除一定数量的字符。

示例文件名:

iso1111_plane001_00321.moc1
iso1111_plane002_00321.moc1
iso2222_plane001_00123.moc1

在每个文件名中,我希望删除文件扩展名前的最后 5 个字符。

例如:

iso1111_plane001_.moc1
iso1111_plane002_.moc1
iso2222_plane001_.moc1

我相信这可以使用 来完成sed,但我无法确定确切的编码。就像是...

for filename in /path/to/local/*.moc1; do
    mv $filname $(echo $filename | sed -e 's/.....^//');
done

...但这不起作用。抱歉,如果我扼杀了这些sed选项,我对此没有太多经验。

4

3 回答 3

6
 mv $filname $(echo $filename | sed -e 's/.....\.moc1$//');

或者

 echo ${filename%%?????.moc1}.moc1

%% 是一个 bash 内部运算符...

于 2013-07-19T16:56:16.137 回答
1

sed命令适用于您提供的所有示例。

sed -e 's/\(.*\)_.*\.moc1/\1_.moc1/'

但是,如果您只想专门“删除文件名中最后一个扩展名之前的 5 个字符”,则此命令就是您想要的:

sed -e 's/\(.*\)[0-9a-zA-Z]\{5\}\.\([^.]*\)/\1.\2/'

您可以像这样在脚本中实现它:

for filename in /path/to/local/*.moc1; do

    mv $filename "$(echo $filename | sed -e 's/\(.*\)[0-9a-zA-Z]\{5\}\.\([^.]*\)/\1.\2/')";

done

第一个命令说明

第一个sed命令通过抓取所有字符直到第一个下划线起作用:\(.*\)_

然后它丢弃所有字符,直到找到.moc1.*\.moc1

然后它将找到的文本替换为它最初在括号内抓取的所有内容:/\1

最后在最后添加.moc1扩展名并结束正则表达式:.moc1/

第二条命令说明

第二个sed命令首先抓取所有字符:\(.*\)

然后它被迫停止抓取字符,因此它可以丢弃五个字符,或者更具体地说,五个位于 0-9、az 和 AZ 范围内的字符:[0-9a-zA-Z]\{5\}

然后是点'.'字符来标记最后一个扩展名:\.

然后它会查找所有非点字符。这可以确保我们获取最后一个扩展:\([^.]*\)

最后,它将所有文本替换为第一个和第二个捕获组,由.字符分隔,并结束正则表达式:/\1.\2/

于 2013-07-19T16:56:29.153 回答
0

这可能对您有用(GNU sed):

sed -r 's/(.*).{5}\./\1./' file
于 2013-07-19T19:45:11.790 回答