我有以下命令:
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' 并且渲染的差异对于眼睛几乎是不可见的。
答案 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
这可以避免臭名昭着的无用的猫:
答案 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上下文兼容它发生在这里。