【发布时间】:2012-09-13 09:30:10
【问题描述】:
我一直在努力让它工作一段时间...this question 有所帮助,但我仍在努力让它发挥作用。我不想安装自制软件,因为这是我现在正在执行的一项罕见任务。
我有几千个文件,其中包含一串文本、一个下划线、更多文本、下划线,最后是我想要保留的重要文件名。尝试使用 \(*\)/\1/ 删除第一个 *_*_ 并保留带有文件扩展名的最后一部分。
我尝试了几种不同的方法,但我得到的只是原始文件名再次被吐出。任何帮助表示赞赏。 - 不确定这是一个正则表达式问题,还是 sed,或者可能两者兼而有之。
ls | sed 's/^*_*_\(*\)/\1/' > ouput.txt;
ls | sed 's/^*_*_\(*\$\)/\1/' > out.txt
ls | sed 's/\(^*_*_\)\(*\$\)/\2/' > out.txt
ls | sed 's/\(^.*_+.*_+\)\(.*\$\)/mv & \2/' > out.txt
【问题讨论】:
-
您能否向我们展示您要删除的文本的外观示例?
-
这是一些非常随机的垃圾......我只想保留 md5 哈希而不是前面的所有随机附加数据。一个示例文件是:cyo (+ 1)_unkn_ac61eb3b4cc8c08a32625443cff9545e.txt
-
@Prince Wesley:我认为这不应该出现在文件名中,如果是这样的话,我很乐意将它与主要批次分开搜索。当我使用“+”和括号运行这些尝试之一时,我遇到了一些错误,但我最近没有看到......也许我只是把它弄坏了。
-
根本问题是你需要了解shell通配符(glob模式)和正确的正则表达式之间的区别。星号在 glob 中表示“任何字符串”,但在正则表达式中,它是一个重复运算符,表示“前一个表达式的零次或多次重复”,一个单独的点是“任何字符”。所以在正则表达式中说“任何东西”的方式是
.*,而单独的*只是一个语法错误。
标签: regex bash sed file-rename