+ -
当前位置:首页 → 问答吧 → tr命令的问题,从一个命令行得到不同的结果。

tr命令的问题,从一个命令行得到不同的结果。

时间:2011-07-26

来源:互联网

这个问题是我从Rad Hat Linux用户基础中看到的,觉得很好奇,在网上没有搜索到相关的信息,所以就拿出来到这里请教下。
这个问题是这样的:
ubuntu@ubuntu-desktop:~$echo 'hark, I hear an elephant!' | tr -d [:punct:]
hark I hear an elephant
ubuntu@ubuntu-desktop:~$ touch n
ubuntu@ubuntu-desktop:~$ echo 'hark, I hear an elephant!' | tr -d [:punct:]
hark, I hear a elephat!
ubuntu@ubuntu-desktop:~$ rm n
ubuntu@ubuntu-desktop:~$ echo 'hark, I hear an elephant!' | tr -d [:punct:]
hark I hear an elephant
为什么会出现这样的情况?
这个叫n的文件为什么会起到这样的作用呢?同样的命令行,为什么会得到不同的结果呢?

作者: jhinux   发布时间: 2011-07-26

回复 jhinux


    我觉得可能是你-d 选项的值没有加单引号的原因,这样就会照成在替换过程,把n当做一个文件,同理你试试touch “punct”中的任意其他字符试试,你加单引号就没有这个问题了
  1. [root@wan sh]# echo 'hark, I hear an elephant!' | tr -d [:punct:]
  2. hark I hear an elephant
  3. [root@wan sh]# touch c
  4. [root@wan sh]# echo 'hark, I hear an elephant!' | tr -d [:punct:]
  5. hark, I hear an elephant!
  6. [root@wan sh]# echo 'hark, I hear an elephant!' | tr -d '[:punct:]'
  7. hark I hear an elephant
复制代码

作者: lionfun   发布时间: 2011-07-26



QUOTE:
回复  jhinux


    我觉得可能是你-d 选项的值没有加单引号的原因,这样就会照成在替换过程,把n当做一 ...
lionfun 发表于 2011-07-26 22:18





    就是由这个原因引起的……
    其实加双引号也是可以的……

作者: xiaopan3322   发布时间: 2011-07-26

回复 xiaopan3322

当然可以的!但是我比较怕得就是soft quote 的元字符替换…… 例如:
  1. [root@wan sh]# n=Y
  2. [root@wan sh]# echo 'Yes $n' | tr -d "$n"
  3. es $n
  4. [root@wan sh]# echo 'Yes $n' | tr -d '$n'
  5. Yes
复制代码

作者: lionfun   发布时间: 2011-07-26

一切tr的作用都可以用sed替代。

作者: zooyo   发布时间: 2011-07-26