Bash Shell修改字符串,你想要重命名一批文件。这些文件的名称基本上正确,就是后缀不对。
解决方案
使用 bash 的参数扩展特性来删除匹配模式的文本,如下例所示。
#!/usr/bin/env bash
# 实例文件: suffixer
#
# 将文件结尾的.bad修改为.bash
for FN in *.bad
do
mv "${FN}" "${FN%bad}bash"
done
讨论
for 循环迭代当前目录中所有以 .bad
结尾的文件名。变量 $FN
每次都会获得其中一个文件名。在该循环中,mv 命令负责重命名文件(将旧名称转变成新名称)。为了避免文件名中包含空格,我们要将其放入引号。
重命名的关键之处是,所引用的 $FN
包含自动删除结尾字符串 bad 的操作。${}
对该引用做了界定,以便与之相邻的字符串 bash 正好追加到已经过删除的文件名结尾。
以下是分解步骤。
NOBAD="${FN%bad}"
NEWNAME="${NOBAD}bash"
mv "${FN}" "${NEWNAME}"
这样你就能从中看出删除无用后缀、创建新文件名、重命名文件的各个步骤。只要习惯了那些特殊运算符,将这些步骤合并成一行也不算糟糕。
因为我们不仅从变量中删除了子串,还将 bad 替换为 bash,所以也可以将替换运算符 /
用于变量引用。类似于那些用/
进行搜索替换的编辑器命令(vi 和 sed 中就有),我们也可以按以下方式这么写:
# 没有锚定好位置,可别这么做
mv "${FN}" "${FN/bad/bash}"
(和编辑器命令不一样的是,我们没有在结尾使用/
,右侧的花括号起到了相同的作用。)
但这种写法有一个问题:没有锚定替换操作的位置,因此可以在变量中的任意位置执行。例如,名为 subaddon.bad 的文件经过替换后就会变成 subashdon.bad,这可不是我们想要的结果。如果将第一个 /
换成 //
,则会替换变量中所有指定的内容,最后就成了 subashdon.bash,这也并非我们所愿。最好按以下方式这么写:
# 添加"."来"锚定"替换模式的位置。这种写法更好,但也不是万无一失
mv "${FN}" "${FN/.bad/.bash}"
解决方案中给出的 ${FN%bad}bash
已经锚定了位置,只删除字符串尾部的文本,在本例中,这正是我们想要的结果。
对变量中的字符串值执行各种操作的运算符有很多种。下表总结了这些运算符。
你可以挨个试试。用起来都非常方便。
酷客网相关文章:
评论前必须登录!
注册