我的.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'
答案 0 :(得分:4)
您的代码中有多个问题。 Don't use ls
in scripts和quote 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 \x81
(U+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。