【发布时间】:2017-02-17 17:22:40
【问题描述】:
我有一个代码示例,似乎在某些文本处理的末尾附加了一段额外的格式:
tr -d [=,=]
我不知道这是做什么的,tr 的手册页没有什么帮助。对此有何见解?
【问题讨论】:
-
顺便说一句,表达式应该被引用以确保安全——如
'[=,=]'——否则shell可以用文件名替换它作为全局结果(如果你有一个名为,的文件,例如)在调用tr之前。
我有一个代码示例,似乎在某些文本处理的末尾附加了一段额外的格式:
tr -d [=,=]
我不知道这是做什么的,tr 的手册页没有什么帮助。对此有何见解?
【问题讨论】:
'[=,=]'——否则shell可以用文件名替换它作为全局结果(如果你有一个名为,的文件,例如)在调用tr之前。
来自man tr 页面,
[=equiv=]
等价类
语法
[=C=]扩展为与C等效的所有字符,没有特定顺序。等价类是一项相对较新的发明,旨在支持非英语字母表。但似乎没有标准的方法来定义它们或确定它们的内容。因此,它们在GNU tr中并未完全实现;每个字符的等价类仅由该字符组成,没有特殊用途。
来自POSIX tr 页面的示例
此示例使用等价类来识别 file1 中基本字符 'e' 的重音变体,这些变体被剥离 diacritical marks (WikiLink) 并写入 file2。
tr "[=e=]" "[e*]" <file1 >file2
即如果在 file1 中,如果 e 表示为重音符号(é 或 è),则将它们视为普通 e
【讨论】:
echo "?;" | tr -d '[=?=]',但第二个字符 U+037E GREEK QUESTION MARK 没有被删除。可能我需要一个定义此类等价类的语言环境,而我根本没有使用这样的语言环境。
LC_COLLATE,来自POSIX 页面,Represents all characters or collating elements belonging to the same equivalence class as equiv, as defined by the current setting of the LC_COLLATE locale category.
它只会删除== 之间的逗号。检查下面的输出。
%_Host@User> echo "1==,==2==,==3=,=4=,=5" | tr -d [=,=]
1====2====3==4==5
%_Host@User>
谢谢。
【讨论】:
echo "1,2,3,4,5" | tr -d [=,=]。
tr 独立于其上下文评估每个字符。周围的内容对行为没有任何影响。