错误TR命令宽度:punct:param

时间:2012-05-23 20:22:31

标签: linux bash unix tr

我有以下命令:

cat original.txt | tr [:upper:] [:lower:] | tr -d [:digit:] | 
tr -d [:punct:] > preproces.txt

系统返回以下错误。

  

翻译时,可能出现的唯一字符类   replaceString是'upper'和'lower'

问题在于:

tr -d [:punct:]

这个问题的解决方案是什么?

我搜索了Google和StackOverflow,但找不到这个问题的答案。

微小的编辑(但对切割和粘贴很重要): 在[:punct:]之前将' - d'更改为'-d' ' - d'被渲染为'\ 342 \ 200 \ 223d' 并且渲染的差异对于眼睛几乎是不可见的。

3 个答案:

答案 0 :(得分:2)

当您尝试以下内容时,您只能收到您所说的信息:

tr '[:alpha:]' '[:digit:]'

我能够使用

tr -d '[:punct:]'

删除标点符号没有问题。例如:

$ echo "tr '[:alpha:]' [:digit:] <chkit.sh" | tr -d '[:punct:]'
tr alpha digit chkitsh
$

这是针对x86 / 64的RHEL 5(tr版本'tr(GNU coreutils)5.97')。

您可能会注意到我将tr的参数括在引号中(单个或双个会这样做,但单个通常更安全)。如果您的目录中潜伏着任何单字母文件名,则可能会遇到shell将方括号解释为字符类并将这些名称传递给tr的问题。假设您有一个文件p

tr [:upper:] [:lower:]

该命令现在是tr p [:lower:]。您得到的错误略有不同,但可能是您的问题与此有关。对shell元字符要非常小心;报价是你的朋友。

请注意,加倍的方括号不是解决方案的一部分:

$ echo "tr -d '[[:alpha:]]' <chkit.sh" | tr -d '[[:alpha:]]'        
 - '::' <.
$

答案 1 :(得分:1)

尝试以下命令:

tr '[:upper:]' '[:lower:]' < original.txt  |
    tr -d '[:digit:]' |
    tr –d '[:punct:]' > preproces.txt

这可以避免臭名昭着的无用的猫

http://iki.fi/era/unix/award.html

答案 2 :(得分:0)

如果您的tr不支持[:digit:][:punct:]字符类,则必须明确指定它们。

tr '[:upper:]' '[:lower:]' < original.txt  |
    tr -d '0-9!"#$%&'"'"'()*+,./:;<=>?@[\\]^_`{|}~-' > preproces.txt

(将两个tr -d命令合并为一个的重构也可以由原始命令中的tr -d '[:digit:][:punct:]'完成。)

[:punct:]的定义是从http://www.regular-expressions.info/posixbrackets.html获得的 - 我没有尝试任何验证,但我稍微重构了它以使其与tr和shell上下文兼容它发生在这里。