【问题标题】:sed file remove leading textsed 文件删除前导文本
【发布时间】: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


【解决方案1】:

这个正则表达式能解决问题吗?如果没有,请报告它的输出是如何关闭的(详细信息),我会帮你调整它。

ls -1 | sed -e 's/^[^_]*_[^_]*_//'

注意 1:您可能希望使用 ls -1 将文件格式化为单列。

注意 2:上述方法只是删除了文件名中不需要的部分,而不是尝试将您想要的部分存储在正则表达式缓冲区中。


编辑

这是一个执行重命名的 bash 脚本。

for f in `ls -1`
do
    new_name=`echo "$f" | sed 's/^[^_]*_[^_]*_//'`
    mv "$f" "$new_name"
done

可以写成单行,但我是为了简洁而不是简洁。

【讨论】:

  • (糟糕,最初的答案有一个复制/粘贴错字。刚刚修复它。)
  • 我应该更清楚...我试图重命名文件,类似于链接的问题,以便以我上次尝试中看到的重命名格式输出它。自从我完成 *nix 命令以来已经有一段时间了,所以如果你有不同的方法,那也很好。 #2 效果很好,#1 提供与输出相同的完整文件名。泰!
  • 啊,明白了。等一下,让我看看我能想出什么。 (我还将删除答案中的第一个 sed 命令,因为它不适合您。)
  • 我实际上刚刚找到了一个应用程序,它会使用正则表达式来查找和选择文本,然后替换为任何内容。当然 cl 可能会更快地进行扩展。感谢您在这里的帮助!
  • ls 连接到管道时自动切换到单列模式,尝试:ls | cat
【解决方案2】:

command | sed 's;^.*_;;' 可以解决问题。使用find 命令代替ls

例如,

 find . -type f | sed 's;^.*_;;' 

【讨论】:

  • 这假定没有应保留的下划线。命令s;^[^_]*_[^_]*_;; 使用了一个更受约束的正则表达式,它只替换第二个下划线。
猜你喜欢
  • 2016-06-19
  • 2010-12-08
  • 2020-10-20
  • 2018-09-05
  • 1970-01-01
  • 1970-01-01
  • 2011-10-20
  • 1970-01-01
  • 2012-09-24
相关资源
最近更新 更多