替代特殊字符

时间:2019-02-12 12:50:02

标签: shell unix encoding scripting locale

我的.txt文件中有一个特殊字符。

我想用ý替换特殊字符| 并将文件从.mnt重命名为.txt

这是我的代码:它将文件重命名为.mnt,但不替换特殊字符

#!/bin/sh
for i in `ls *.txt 2>/dev/null`;
do
filename=`echo "$i" | cut -d'.' -f1`
sed -i 's/\ý/\|/g' $i
mv $i ${filename}.mnt
done

该怎么做?

示例:

BEGIN_RUN_SQLýDELETE FROM PRC_DEAL_TRIG WHERE DEAL_ID = '1:2:1212'

1 个答案:

答案 0 :(得分:4)

您的代码中有多个问题。 Don't use ls in scriptsquote your variables.,您应该使用$(command substitution)而不是传统的`command substitution`语法。

如果您的任务是替换文件内容中的ý(而不是文件名),sed -i没错,但是多余;只需将更新的内容写入新位置并删除旧文件即可。

#!/bin/sh
for i in *.txt
do
    filename=$(echo "$i" | cut -d'.' -f1)
    sed 's/ý/|/g' "$i" >"${filename}.mnt" && rm "$i"
done

如果您的系统配置为UTF-8,则字符ý可以用字节序列表示 \xc3 \xbd(代表U+00FD)或分解后的序列\0x79 \xcc \x81U+0079 + U+0301)-您可能会发现文件包含一个代表,而终端更喜欢另一个。真正确定的唯一方法是检查文件中和终端上的十六进制字节。您的终端也很可能无法完全显示文件的内容。试试

bash$ printf 'ý' | xxd
00000000: c3bd

bash$ head -c 16 file | xxd
00000000: 4245 4749 4e5f 5255 4e5f 5351 4cff 4445  BEGIN_RUN_SQL.DE

如果(如此处所示)发现它们不同(后者在“ BEGIN_RUN_SQL”和“ DE”之间输出单个字节\xff),那么简单的方法将不起作用。您的sed可能支持也可能不支持传递原汁原味的十六进制序列来确切地表达 替代内容;或尝试例如如果没有,则为Perl。