首先,我应该说,最简单的方法是使用prename或重命名命令。
在Ubuntu,OSX(Homebrew软件包rename
,MacPorts软件包p5-file-rename
)或其他使用perl重命名(prename)的系统上:
rename s/0000/000/ F0000*
或在从util-linux-ng重命名的系统上,例如RHEL:
rename 0000 000 F0000*
这比等效的sed命令更容易理解。
但是对于理解sed命令,sed联机帮助页很有帮助。如果运行man sed并搜索&(使用/命令进行搜索),则会发现它是s / foo / bar /替换中的特殊字符。
s/regexp/replacement/
Attempt to match regexp against the pattern space. If success‐
ful, replace that portion matched with replacement. The
replacement may contain the special character & to refer to that
portion of the pattern space which matched, and the special
escapes \1 through \9 to refer to the corresponding matching
sub-expressions in the regexp.
因此,\(.\)
与第一个字符匹配,可以由引用\1
。然后.
匹配下一个始终为0的字符。然后\(.*\)
匹配文件名的其余部分(可以由引用)\2
。
替换字符串使用&
(原始文件名)将所有内容组合在一起,\1\2
这是文件名除第二个字符(为0)之外的每个部分。
恕我直言,这是一种非常神秘的方法。如果由于某种原因重命名命令不可用,而您想使用sed进行重命名(或者您可能对重命名所做的事情太复杂了吗?),则在正则表达式中使用更明确的名称将使其更具可读性。也许像这样:
ls F00001-0708-*|sed 's/F0000\(.*\)/mv & F000\1/' | sh
能够看到s / search / replacement /中实际更改的内容,使其更具可读性。另外,如果您不小心运行了两次或类似的文件,它也不会继续从文件名中吸收字符。