在两个模式之间插入字符串

在两个模式之间插入字符串

我想更改名称如下的文件:

d1-a2_A1_B1.txt
abcd_A90_B2.txt

我想_FOO在第一个_A[0-9]\+_B[0-9]第二个之间插入文件名

d1-a2_A1_FOO_B1.txt
abcd_A90_FOO_B2.txt

但我的正则表达式不起作用:

for f in $(ls); do mv $f \`echo $f | sed -e s/\(.*_A[0-9]\+\)\(_B[0-9].*\)/$1_FOO$2/\`; done

我尝试用一​​个字符串:

echo abcd_A90_B2.txt | sed -e s/\(.*_A[0-9]\+\)\(_B[0-9].*\)/$1_FOO$2/

好的:这有效:

echo abcd_A90_B2.txt | sed -e 's/\(_A[0-9]\+\)\(_B[0-9]\)/\1_FOO\2/'

答案1

  • 添加-r选项sed(让它使用扩展正则表达式;它通常不理解+)。

  • 将您的sed脚本放入引号中(最好是单引号)。

  • 将脚本中的$1和更改为和:$2\1\2

    sed-re 命令s/(._A[0-9]+)(_B[0-9].)/\1_FOO\2/

还,

  • 为了清楚起见,你可能需要更改`…`$(…)— 请参阅, 和— 即,以echo | sed处理 的相同方式处理ls
  • 最好说for f in *(而不是for f in $(ls))。
  • 您应该引用 shell 变量引用(例如echo "$f"),除非您有充分的理由不这样做,并且您确定您知道自己在做什么。

答案2

您可以通过以下方式避免使用 sed 和其他字符串操作mmv

$ mmv -m -n  '*_A*_B*.txt' '#1_A#2_FOO_B#3.txt'
abcd_A90_B2.txt -> abcd_A90_FOO_B2.txt
d1-a2_A1_B1.txt -> d1-a2_A1_FOO_B1.txt

(一旦您确认所有文件均已匹配并按需要重命名,请删除-n或将其替换为,以实际重命名文件。-v

相关内容