0

我有以下命令:

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' 并且渲染的差异几乎肉眼看不见。

4

3 回答 3

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:]]'        
 - '::' <.
$
于 2012-05-23T23:56:40.440 回答
1

尝试以下命令:

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

这避免了臭名昭著的无用 cat

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

于 2012-05-23T20:27:51.950 回答
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 上下文兼容。

于 2014-10-21T10:38:53.777 回答