我有一个目录中的文件名列表( /path/to/local )。 我想从所有这些文件名中删除一定数量的字符。
示例文件名:
iso1111_plane001_00321.moc1 iso1111_plane002_00321.moc1 iso2222_plane001_00123.moc1
例如:
在Bashpipe道中读取标准input块
如何在bash脚本中回显“$ x_ $ y”?
Git bash没有显示在我的窗口上的另一个useraccount
使用GNU并行在一个巨大的目录树上加速查找命令的最佳方法是什么?
在bash脚本中,在脚本退出后的提示符上打印命令(作为build议)
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选项,我没有太多的经验。
这个简单的bash命令有什么问题?
Unix脚本在每行末尾添加^ M
使用Bash脚本将input提供给命令行
可变比较错误
在命令不执行
mv $filname $(echo $filename | sed -e 's/......moc1$//');
要么
echo ${filename%%?????.moc1}.moc1
%%是一个bash内部操作符…
这个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扩展名并结束正则表达式: .moc1/
第二个命令解释
第二个sed命令首先抓取所有的字符: (.*)
然后强制停止抓取字符,这样可以丢弃5个字符,或者更具体地说,可以丢弃位于0-9,az和AZ范围内的五个字符: [0-9a-zA-Z]{5}
然后是“点'.' 字符来标记最后的扩展名: .
然后它查找所有非点字符。 这确保我们抓住最后的扩展: ([^.]*)
最后,它将用第一个和第二个捕获组替换所有的文本,并用. 字符,并结束正则表达式:/ /1.2/
这可能适用于你(GNU sed):
sed -r 's/(.*).{5}./1./' file
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 [email protected] 举报,一经查实,本站将立刻删除。