首页 > 解决方案 > Shell脚本:用另一个字符替换特殊字符

问题描述

我有一个名称上有特殊字符的文件,我想用“X”替换它的每个特殊字符:

我的特殊字符:空格,!@'?& ( ) [ ] `

我试过了sedtr但我没有找到让它工作的方法,我考虑过使用 [:alanum:] oftr但我不希望其他字符改变。

这是我的文件的名称:

aze !on'(@?.txt

我想要的结果是:

azeXXonXXXX.txt

标签: bashshell

解决方案


在 bash 中,您可以使用mvwith 参数替换

#! /bin/bash
touch "aze !on'(@?.txt" "aze,!@'?&()[]\`"
for f in aze* ; do
    mv "$f" "${f//[ ,\!@?&()\[\]\'\`]/X}"
done

如果你想使用tr,你可以:

for f in aze* ; do
    new=$(tr ' ,!@?&()[]`'\' 'X'  <<< "$f")
    mv "$f" "$new"
done

或者,使用 POSIX 类,

    new=$(printf %s "$f" | tr -c '[:alnum:].' X)
    # or
    new=$(tr -c '[:alnum:].\n' X <<< "$f")

请注意,换行符需要包含在 中,因为它已添加到输入中,如果不包含,则<<<随后替换为。X

sed 也一样:

    new=$(sed 's/[][ ,!@?&()`'\'']/X/g' <<< "$f")

推荐阅读