[已解决]批量删除字符后出现乱码问题

sh/bash/dash/ksh/zsh等Shell脚本
回复
头像
tgchen
帖子: 25
注册时间: 2008-04-21 15:55

[已解决]批量删除字符后出现乱码问题

#1

帖子 tgchen » 2008-04-29 1:52

今天在网上复制一篇文章,里面随机插入了干扰信息“字串0”-“字串9”,于是我想把这些删除。

代码: 全选

cat filename |tr -d "字串[0-9]" >newfile
打开newfile后乱码了:

代码: 全选

评��:��错,Chix的确是��钻研Linux。��立LinuxChix的Deb Richardson想打箈�����能让��性��用的Linux邮���表。LinuxChix�的����,简直比Deb期望的还要流行。而�������的LinuxChix LUGs ���经����走����球。
我想可能是不能转换中文的问题,于是我先用gedit打“字串“这两个字替换成”abcdefg“,然后再执行:

代码: 全选

cat filename |tr -d abcdefg[0-9] >newfile 
这次可以了,没有乱码。

现在问题是有没有直接就删除而不出现乱码的方法呢?
上次由 tgchen 在 2008-04-29 11:57,总共编辑 1 次。
thword
帖子: 119
注册时间: 2007-04-09 12:19

#2

帖子 thword » 2008-04-29 7:35

tr对中文的支持不是很好,换用sed吧。

代码: 全选

sed 's/字串[0-9]//' filename > newfile
头像
tgchen
帖子: 25
注册时间: 2008-04-21 15:55

#3

帖子 tgchen » 2008-04-29 11:03

thword 写了:tr对中文的支持不是很好,换用sed吧。

代码: 全选

sed 's/字串[0-9]//' filename > newfile
试了一下,效果那是相当不错,谢谢了
能稍稍解释一下吗 :oops:
头像
laborer
帖子: 1016
注册时间: 2005-10-25 11:15
联系:

#4

帖子 laborer » 2008-04-29 11:15

你把tr的意义理解错了,tr -d "abc"的意思是删除文档中的字符a、字符b、字符c,而不是删除字符串"abc"
hreiser@oakland:~$ killall -9 wife
police@oakland:~$ sudo find / -user hreiser
court@oakland:~$ sudo mv /home/hreiser /jail/
court@oakland:~$ sudo usermod -d /jail/hreiser -s "/usr/sbin/chroot /jail/" hreiser
头像
tgchen
帖子: 25
注册时间: 2008-04-21 15:55

#5

帖子 tgchen » 2008-04-29 11:32

laborer 写了:你把tr的意义理解错了,tr -d "abc"的意思是删除文档中的字符a、字符b、字符c,而不是删除字符串"abc"
太谢谢你了,让我从错误中走了出来。 :D

现在想想,是不是tr 把中文的两个字节拆开了,所以才会出现乱码
头像
BigSnake.NET
帖子: 12522
注册时间: 2006-07-02 11:16
来自: 廣州
联系:

#6

帖子 BigSnake.NET » 2008-04-29 13:56

tgchen 写了:
laborer 写了:你把tr的意义理解错了,tr -d "abc"的意思是删除文档中的字符a、字符b、字符c,而不是删除字符串"abc"
太谢谢你了,让我从错误中走了出来。 :D

现在想想,是不是tr 把中文的两个字节拆开了,所以才会出现乱码
对. tr 只对字节操作
^_^ ~~~
要理解递归,首先要理解递归。

地球人都知道,理论上,理论跟实际是没有差别的,但实际上,理论跟实际的差别是相当大滴。
thword
帖子: 119
注册时间: 2007-04-09 12:19

#7

帖子 thword » 2008-04-29 14:13

tgchen 写了:
thword 写了:tr对中文的支持不是很好,换用sed吧。

代码: 全选

sed 's/字串[0-9]//' filename > newfile
试了一下,效果那是相当不错,谢谢了
能稍稍解释一下吗 :oops:
s表示查找替换
/是分隔符,不一定要用/,用其它分隔符也可以,比如#
第一个/后面是要查找的字符
第二个/后面是表示替换后的字符,这里留空,表示删除
第三个/后面可以加一些控制符,比如g,表示全局替换;这里留空表示每行只替换一次

因为一般网页中加入随机字符,通常都是每行加一次,所以我就没用g
回复