重命名 Unix 命令中的正则表达式

Posted

技术标签:

【中文标题】重命名 Unix 命令中的正则表达式【英文标题】:Regular expression in rename Unix command 【发布时间】:2021-12-19 21:59:23 【问题描述】:

我正在尝试重命名一些文件,并且对正则表达式很陌生。我知道如何做到这一点,但我正在尝试一些代码高尔夫来缩短它。

我的文件:

abc4800_12_S200_R1_001.fastq.gz

我的目标:

abc4800_12_R1.fastq.gz

现在我有一个重命名它的两步过程:

rename 's/_S[0-9]+//g' *gz
rename 's/_001//g' *gz

但我试图将其缩短为一行以一次性清理它。

我试图使用正则表达式来跳过中间的部分,但我不知道在这个函数中这是否真的可行。

rename 's/_S[0-9]+_*?_001//g' *gz

【问题讨论】:

【参考方案1】:

使用捕获组来保留要替换的片段的中间部分。

rename 's/_S\d+_(.*)_001/_$1/' *gz

【讨论】:

【参考方案2】:

使用您显示的示例,请尝试以下rename 命令。我在这里使用-n 选项,这是命令的试运行。一旦您对输出感到满意(例如,如果我们运行实际代码,文件将如何重命名),请从以下 rename 代码中删除 -n 选项。

rename -n 's/(^[^_]*_[^_]*)_[^_]*(_[^_]*)[^.]*(\..*$)/$1$2$3/' *.gz

输出如下:

rename(abc4800_12_S200_R1_001.fastq.gz, abc4800_12_R1.fastq.gz)

解释:

(^[^_]*_[^_]*)  ## Creating the 1st capturing group which captures everything from starting to just before 2nd occurrence of _ here.
_[^_]*          ## Matching (without a capturing group) _ then just before the next occurrence of _ here.
(_[^_]*)        ## Creating the 2nd capturing group here which matches _, followed by before the next occurrence of _ here.
[^.]*           ## Matching everything just before dot comes (not capturing here).
(\..*$)         ## Creating the 3rd capturing group which has a dot till the end of line in it.

【讨论】:

感谢您对捕获组的解释!我知道它们是一回事,但在这种情况下很难让它们工作。这通过使用几个有很大帮助,所以我可以更详细地了解它们是如何使用的。非常感谢!【参考方案3】:

您正在尝试用任何内容替换字符串中的两个部分。使用交替运算符。它将匹配左侧或右侧;用相同的替换字符串替换任何匹配项(即没有):

rename 's/_S[0-9]+|_001//g' *gz

【讨论】:

哇哦,这是一个很酷的技巧。我正在考虑使用上面示例中的捕获组,但遇到了问题。我不知道这个功能,谢谢你的课。

以上是关于重命名 Unix 命令中的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章

Bash 正则表达式重命名文件

重命名目录中的所有文件?

正则表达式批量重命名 OS X 终端中的文件

如何快速重命名文件夹中的一堆文件

使用正则表达式重命名文件名

使用 python 重命名文件 - 正则表达式