regex 在linux中重命名所有与某个模式匹配的文件名

xe55xuns  于 2023-08-08  发布在  Linux
关注(0)|答案(1)|浏览(91)

如何在linux中将目录中所有与A_B_[any number c]_[any number d].R匹配的文件名更改为A_B_[number c]_M_[number d].R?即,在这些匹配的文件名中插入“M”。
此目录中还有名为A_B_[any number]_D_[any number].R的文件,这些文件不应受到影响。
我试过rename 's/(\d+)_(\d+)/$1_M_$2/' *,但它不工作。

3z6pesqy

3z6pesqy1#

试试这个:

rename -n 's/^A_B_(\d+)_(\d+)\.R/A_B_$1_M_$2.R/' A_B_*.R

字符串
解释:

  • rename是linux上的一个常用工具。
  • 表达式's/^A_B_(\d+)_(\d+)\.R/A_B_$1_M_$2.R/'表示搜索和替换:
  • ^表示文件名的开头
  • A_B_匹配行首之后的文字字符
  • (\d+)匹配任意位数,并将结果捕获为$1
  • _匹配文本下划线
  • (\d+)将下一组数字捕获到$2
  • /A_B_$1_M_$2.R/是使用捕获组并在中间注入“M”的替换表达式。
  • A_B_*.R是一个glob模式,指示要输入到rename中的文件
  • 模式A_B_[any number]_D_[any number].R的文件将被跳过,因为它与上面的正则表达式不匹配。

奖励积分:
要确保跳过某些文件,可以使用bash extended globbing

#!/bin/bash

shopt -s extglob

rename -n 's/^A_B_(\d+)_(\d+)\.R/A_B_$1_M_$2.R/' A_B_+([0-9])_+([0-9]).R

相关问题