• 2.6用tr进行转换


    tr可以对来自标准输入的内容进行字符替换、字符删除以及重复字符压缩。它可以将一组字符变成另一组字符,因而通常也被称为转换命令。

    1、tr只能通过stdin(标准输入),而无法通过命令行参数来接受输入。它的调用格式如下:

    tr [options] set1 set2

    将来自stdin的输入字符从set1映射到set2,然后将输出写入stdout(标准输出)。set1和set2是字符类或字符集。如果两个字符集的长度不相等,那么set2会不断重复其最后一个字符,直到长度与set1相同。如果set2的长度大于set1,那么在set2中超出set1长度的那部分字符则会全部被忽略。

    2、将输入字符由大写转换为小写,如

    $echo "HELLO WHO IS THIS" |tr 'A-Z' 'a-z'

    'A-Z'和‘a-z’都是集合。可以按照需要追加字符或字符类来构造自己定制的集合。

    定义集合方式:a、“起始字符-终止字符”这种格式就行了;b、如果“起始字符-终止字符”不是一个连续的字符序列,那么它就会被视为包含了3个元素的集合,也就是:起始字符,-,终止字符。

    3、工作原理

    通过在tr中使用集合的概念,我们可以轻松地将字符从一个集合映射到另一个集合中。如使用tr进行数字加密和解密

    eg:$echo 12345 | tr '0-9' '9876543210'

    87654

    eg:$echo 87654 | tr '9876543210' '0-9'

    又如,ROT13是一个著名的加密算法,在该算法中,文本加密和解密都使用同一个函数。它按照字母表排列顺序执行13个字母的转换。用tr进行ROT13加密:

    $echo "tr came, tr saw, tr conquered." | tr 'a-zA-Z' 'n-za-mN-ZA-M'

    输出ge pnzr,ge fnj,ge pbadhrerq.

    对加密后的密文再次使用同样的ROT13函数,

    $echo ge pnzr,ge fnj,ge pbadhrerq. |tr tr 'a-zA-Z' 'n-za-mN-ZA-M'

    输出tr came, tr saw, tr conquered.

    tr 还可以用来将制表符转换成空格:

    $ tr ' ' ' ' <file.txt

    4、补充内容

    a、用tr删除字符

    tr有一个选项-d,可以通过指定需要被删除的字符集合,将出现在stdin中的特定字符清除掉:

    $cat file.txt | tr -d 'set1'

    #只使用set1,不适用set2

    如:

    $echo "Hello 123 world 456" | tr -d '0-9'

    Hello world

    #将stdin中的数字删除并打印出来

    b、字符集补集

    可以利用-c来使用set1的补集

    tr -c [set1] [set2]

    set1的补集意味着这个集合中包含set1中没有的所有字符。

    ru:

    echo hello 1 char 2 next 4 | tr -d -c '0-9 '

    在这里,补集中包含了除数字、空格字符和换行符之外的所有字符。因为指定了-d,所以这些字符全部都被删除。

    c、用tr压缩字符

    连续的重复字符应该在压缩成单个字符。经常需要从事的一项任务就是压缩空白字符。

    tr的-s选项可以压缩输入中重复的字符。用它来巧妙执行加法

    $cat sum.txt

    1

    2

    3

    4

    5

    $cat sum.txt | echo $[ $(tr ' ' '+' ) 0 ]

    15

    在上面的命令中,tr用来将' '替换成'+',因此我们得到了字符串"1+2+3+4+5",但是在字符串的尾部多了一个操作符+,故追加一个0.

    又如,摒除多余的换行符

    $cat multi_blanks.txt |tr -s ' '

    line1

    line2

    line3

    line4

    d、字符类

    tr可以像使用集合一样使用各种不同的字符类。

    alnum:字母和数字

    alpha:字母

    cntrl:控制(非打印)字符

    digit:数字

    graph:图形字符

    lower:小写字母

    print:可打印字符

    punct:标点符号

    space:空白字符

    upper:大写字母

    xdigit:十六进制字符

    可按照下面的方式选择并使用所需的字符类

    tr [ :class: ] [:class:]

    如tr '[:lower:]' '[:upper:]'

  • 相关阅读:
    乘电梯(动规+单调队列队头优化)
    贪心基础题目整理
    动规基础方程整理
    [第一波模拟day3T3]{益智游戏}(game.cpp)
    [第一波模拟day3T2]{独立集}(bubble.cpp)
    [第一波模拟day1T2]{分班}(divide.cpp)
    考前模版整理
    [Noip2004][Day ?][T?]合并果子(?.cpp)
    [Noip2017][Day 1][T1]玩具谜题(toy.cpp)
    新开始?
  • 原文地址:https://www.cnblogs.com/gary-guo/p/6121080.html
Copyright © 2020-2023  润新知