tr 使用gnu的命令行选项
env GOPATH=`pwd` go get -u github.com/guonaihong/coreutils/tr/tr
(来自linux shell cookbook)
tr只能通过stdin接收输入。调用格式如下:
tr [options] set1 set2
来自stdin的输入字符会按照位置从set1映射到set2,然后将输出写入stdout。set1和set2是字符类或字符组。
如果两个字符组的长度不相等,那么set2会不断复制其最后一个字符,直到长度与set1相同。
如果set2的长度大于set1,那么在set2中超出set1长度的那部分字符则全部被忽略。
要将输入中的字符由大写转换成小写,可以使用
echo "HELLO WORLD" |tr 'A-Z' 'a-z'
'A-Z'和'a-z'都是字符组。我们可以按照需要追加字符或字符类来构造自己的字符组。 'ABD-}'、'aA., '、'a-ce-x'以及'a-c0-9'等均是合法的集合。定义集合也很简单,不需要书写一长串连续的字符序列, 只需要使用“起始字符-终止字符”这种格式就行了。这种写法也可以和其他字符或者字符类结合使用。如果“起始字符-终止字符” 不是有效连续字符序列,那么它就会被视为含有3个元素的集合(起始字符、-和终止字符)。你也可以使用像'\t'、'\n'这种特殊字符或者其他ASCII字符
在tr中利用集合的概念,可以轻松地将字符从一个集合映射到另一个集合中。
echo 12345|tr '0-9' '9876543210'
87654
echo 87654|tr '9876543210' '0-9'
tr命令可以用来加密。ROT13是一个著名的加密算法。在ROT13算法中,字符会被移动13个位置,因此文本加密和解密都使用相同一个函数
echo "tr came, tr saw, tr conquered."|tr 'a-zA-Z' 'n-za-mN-ZA-M'
output:
ge pnzr, ge fnj, ge pbadhrerq.
还可以将制表符转换成单个空格:
tr '\t' ' ' < file.txt
tr有一个选项-d,可以通过指定需要被删除的字符集合,将出现在stdin中的特定字符清除掉:
cat file.txt | tr -d '[set1]'
#只使用set1,不使用set2
例如:
echo "Hello 123 world 456"|tr -d '0-9'
Hello world
将stdin数字删除并打印删除后的结果
可以利用选项-c来使用set1的补集。下面的命令中,set2是可选的:
tr -c [set1] [set2]
如果只给出了set1,那么tr会删除所有不在set1中的字符。如果也给出了set2,tr会将不在set1中的字符转换成set2中的字符。 如果使用了-c选项,set1和set2必须都给出。如果-c与-d选项同时出现,你只能使用set1,其他所有的字符都会被删除。 下面的例子会从输入文本中删除不在补集中的所有字符:
echo hello 1 char 2 next 4|tr -d -c '0-9\n'
124
接下来的例子会将不在set1中的字符替换成空格
echo hello 1 char 2 next 4| tr -c '0-9' ' '
1 2 4
tr命令能够完成很多文本处理任务。例如,它可以删除字符串中重复出现的字符。基本实现形式如下:
tr -s '[需要被压缩的一组字符]'
如果你习惯在点号后面放置两个空格,你需要在不删除重复字母的情况下去掉多余的空格:
echo "GNU is not UNIX. Recursive right ?"|tr -s ' '
tr命令还可以用来删除多余的换行符:
cat multi_blanks.txt
hello
world
#
我爱中国
cat multi_blanks.txt|tr -s '\n'
hello
world
#
我爱中国
上面的例子展示了如何使用tr删除多余的'\n'字符。接下来让我们用一种巧妙的方式将数字列表进行相加
seq 10|echo $[ `tr '\n' '+' ` 0]
-s 支持两个集合
echo -e "aaaaaaaaaaaaaaaaaaaaaaaaaa1 \n\n\nbbbbbbbb2" |tr -s "a-z" "0-9"
-s -d组合使用
echo -e "aaaaaaaaaaaaaaaaaaaaaaaaaa1 \n\n\nbbbbbbbb2" |tr -s -d "a-z" "0-9"
echo "`echo -n {0..9}``echo -n {a..z}`" |tr -d " " |tr -d -s "0-9" "a-c"
-c使用
echo -n "0 1 2 3 4 5 6 7 8 9 a b c d e f g h i j k l m n o p q r s t u v w x y z"|tr -d " " |tr -c "0-9" "a-c"
output:
0123456789cccccccccccccccccccccccccc
tr可以将不同的字符类作为集合使用,所支持的字符类如下所示。
- alnum: 字母和数字
- alpha: 字母
- cntrl: 控制(非打印)字符
- digit: 数字
- graph: 图形字符
- lower: 小写字母
- print: 可打印字符
- punct: 标点符号
- space: 空白字符
- upper: 大写字母
- xdigit: 十六进制字符
可以按照下面的方式选择所需的字符类
tr [:class:] [:class:]