Bash Shell修改字符串

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 已经锚定了位置,只删除字符串尾部的文本,在本例中,这正是我们想要的结果。

对变量中的字符串值执行各种操作的运算符有很多种。下表总结了这些运算符。

Bash Shell修改字符串

你可以挨个试试。用起来都非常方便。

酷客网相关文章:

赞(0)

评论 抢沙发

评论前必须登录!