将文件名中的一个字符与另一个交换

Ger*_*nas 4 command-line bash batch-rename text-processing

我有一个名为a_b-c-d-e-f.txt. 我想采用当前名称并交换破折号和下划线,使其变为a-b_c_d_e_f.txt.

我的直觉告诉我尝试renametr,但我遇到了这个问题。这是我目前的尝试

#!/bin/bash
for i in *.txt; do
  [ -f "$i" ] || break
  newFile=$(echo "$i" | tr '-' '_')
  cp "$i" $newFile
done
Run Code Online (Sandbox Code Playgroud)

有了这个,我结束了

a_b_c_d_e_f.txt
Run Code Online (Sandbox Code Playgroud)

这是 ab 之间不应该改变的部分。此外,破折号不一定总是在文件名中的那个位置。例如,它可能看起来像

a-b-c_d-e-f.txt
Run Code Online (Sandbox Code Playgroud)

或者像这样的任何组合。我希望他们翻转不管他们在名字中的位置。

小智 7

$ echo "a-b_c" | tr '_-' '-_'
a_b-c
Run Code Online (Sandbox Code Playgroud)


ste*_*ver 6

其他一些选择:

  1. 你的循环,但用 sed 很少使用的y音译命令代替trex。

    printf -v newFile "%s" "$(sed 'y/_-/-_/' <<<"$i")"
    
    Run Code Online (Sandbox Code Playgroud)
  2. 基于renameperl 的命令,使用 perl 的内置命令tr(不需要 shell 循环)

    rename -n 'tr/_-/-_/' *[-_]*.txt
    
    Run Code Online (Sandbox Code Playgroud)

    (删除-n当你快乐时它在做正确的事情)。