重命名 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 命令中的正则表达式的主要内容,如果未能解决你的问题,请参考以下文章