tr '[0*4]' '*' < data.txt
若data.txt中的任意行中出现了连续4个0,就是4个****替换。必须是[0*4]形式,不能是0*4,否则数字4会被替换成*,原因是[0*4]是tr的语法[CHAR*REPEAT],儿后面是*也可以是****,这里只使用了一个*,是因为tr的一个特性:当SET1(上面的[0*4])的长度大于SET2(上面的*)时,SET2会重复SET1的最后一个字符。例如,SET1是0000,由于SET2是一个*,先将SET1变成*000,再由于SET2的长度小于SET1,重复SET1的最后一个*,变成****
tr -cs '[:lower:][:upper:]' '\n' < data.txt
将将data.txt中的每一行数据中不符合所有大小写字符的数据用\n替换(当SET2的长度小于SET1时,重复SET1的最后一个字符),然后再压缩\n为一个\n。例如,输入是abcd1234efgh,针对这个数据,其满足SET1条件后的补集是1234,即替换成4个\n(换行),经过压缩后,变成一个\n。输出便是
abcd
efgh
tr -s '[:punct:][:blank:]' '\n' < data.txt
这个例子和上面的意思基本一样,不过不是替换SET1的补集,而是替换满足SET1条件的数据。
tr -ds '[:digit:]' '\n' < data.txt
删除data.txt中每一行的数字,再针对每一行的数据进行其中的\n压缩
tr -d -- -axM < data.txt
若要删除data.txt中的每一行中的字符 - , a , x , M,可用这种形式,中间的两个--表示到此停止tr的OPTION的处理,后面的数据都是SET1的数据
选项总结:
选项 | SET1 | SET2 | 意义 |
---|---|---|---|
无 | 有 | 有 | 用SET2的数据替换每一行符合SET1模式的数据 |
-d | 有 | 无 | 删除每一行中符合SET1模式的数据 |
-s | 有 | 无 | 用SET1的数据压缩每一行的符合模式的数据 |
-s | 有 | 有 | 用SET2的数据先替换符合SET1模式的数据,然后压缩每一行的符合SET2模式的数据 |
-ds | 有 | 有 | 删除每一行中符合SET1模式的数据,然后压缩符合SET2模式的数据 |
-cs | 有 | 有 | 用SET2的数据替换不符合SET1模式的数据,然后压缩每一行的符合SET2模式的数据 |
替换过程的长度总结:
若SET1的长度等于SET2的长度,则每一个字符对应替换。例如,设SET1是0000,SET2是*wkz,则替换后,符合SET1的数据变为*wkz
若SET1的长度大于SET2的长度,则SET2将重复SET1最后一个匹配的字符。例如SET1是a-z,表示26个字符,SET2是A-B,则A替换a,B替换b,然后这最后一个替换的B将不停重复,知道长度和SET1的相等
若SET1的长度小于SET2的长度,这种情况不允许,结果未定义