ubuntu中tr命令使用教程

来源:互联网 发布:centos 7.2怎么样 编辑:程序博客网 时间:2024/06/08 11:32

1、关于tr
      通过使用 tr,您可以非常容易地实现 sed 的许多最基本功能。您可以将 tr 看作为 sed 的简化的变体:它可以用一个字符来替换另一个字符,或者可以完全除去一些字符。您也可以用它来除去重复字符。这就是所有 tr 所能够做的。 
       tr用来从标准输入中通过替换或删除操作进行字符转换。tr主要用于删除文件中控制字符或进行字符转换。使用tr时要转换两个字符串:字符串1用于查询, 字符串2用于处理各种转换。tr刚执行时,字符串1中的字符被映射到字符串2中的字符,然后转换操作开始。
带有最常用选项的tr命令格式为:
tr -c -d -s ["string1_to_translate_from"] ["string2_to_translate_to"] < input-file
-c 用字符串1中字符集的补集替换此字符集,要求字符集为ASCII。
-d 删除字符串1中所有输入字符。
-s 删除所有重复出现字符序列,只保留第一个;即将重复出现字符串压缩为一个字符串。
input-file是转换文件名。虽然可以使用其他格式输入,但这种格式最常用。

指令名称: tr -- 字符的转换与删除 说明: 这指令是个字符过滤器,数据由标准输入流入,经过指令的指定转换后,再导向标准输出。感觉上很像一个筛子。

基本上,指令一次处理一个字符,所以不具备识别"英文单字"这种特定顺序的字符组合。目前这个指令也不适合处理中文档案。 选项: -c, --complement 反选设定字符。也就是符合 SET1 的部份不做处理,不符合的剩余部份才进行转换 -d, --delete 删除指令字符 -s, --squeeze-repeats 缩减连续重复的字符成指定的单个字符 -t, --truncate-set1 削减 SET1 指定范围,使之与 SET2 设定长度相等 --help 显示程序用法信息 --version 显示程序本身的版本信息 以下是特定的字符设定(SETs),与他们所代表的意义 \NNN 8进位的 ASCII 码倒斜线(backslash)
\a 警示声 (BEL)
\b 光标倒退一格字符(backspace)
\c 在行尾不加上换行字符(同 -n 选项的作用)
\f 换页(form feed)
\n 换行(new line)
\r 游标回归行首(carriage return)
\t 水平跳格(horizontal tab)
\v 垂直跳格(vertical tab)
\\ CHAR1-CHAR2
:字符范围从 CHAR1 到 CHAR2 的指定,范围的指定以 ASCII 码的次序为基础,只能由小到大,不能由大到小。 [CHAR*] :这是 SET2 专用的设定,功能是重复指定的字符到与 SET1 相同长度为止 [CHAR*REPEAT]
:这也是 SET2 专用的设定,功能是重复指定的字符到设定的 REPEAT 次数为止(REPEAT 的数字采 8 进位制计算,以 0 为开始) [:alnum:] :所有字母字符与数字
[:alpha:] :所有字母字符
[:blank:] :所有水平空格
[:cntrl:] :所有控制字符
[:digit:] :所有数字
[:graph:] :所有可打印的字符(不包含空格符)
[:lower:] :所有小写字母
[:print:] :所有可打印的字符(包含空格符)
[:punct:] :所有标点字符
[:space:] :所有水平与垂直空格符
[:upper:] :所有大写字母
[:xdigit:] :所有 16 进位制的数字
[=CHAR=] :所有符合指定的字符(等号里的 CHAR,代表你可自订的字符)

实例说明: 以下两种型态是运用 tr 指令常见的模式。

# cat file-A | tr [A-Z] [a-z]
# tr [A-Z] [a-z] < file-A > file-a 基本上 tr 属于搭配型指令,因此数据通常藉由 pipeline(符号"|") 或 input redirection(符号"<")来导入,其指令本身并不支持档案的呼叫。导入的数据经由 tr 过滤转换后会导向标准输出显示在屏幕上。 大小字母的转换 tr 指令非常适合用来做大小写字母的转换。 # tr [:upper:] [:lower:] < file-A > file-a
# tr [:lower:] [:upper:] < file-b> file-B 第一行是将大写字母转成小写字母,第二行则是小写字母转成大写字母。两行使用的语法则是特定的写法,其实也可以改写如下 # tr 'A-Z' 'a-z' < file-A > file-a
# tr 'a-z' 'A-Z' < file-b> file-B 这种写法比较简短,我个人也比较惯用。其实用这种写法有一个好处,当我想将一个文本文件的大小写全部反过来时,这个语法可以做到。来看下面的例子 # cat file-Aa
SEE ALSO
The full documentation for tr is maintained as a Texinfo manual.
If the info and tr programs are properly installed at your site,
the command info tr should give you access to the complete manual.
# 这是一个普通的文本文件,使用 tr 可以容易地将整个档案的大小写字母反过来,如下 # tr 'a-zA-Z' 'A-Za-z' < file-Aa | tee file-aA
see also
tHE FULL DOCUMENTATION FOR TR IS MAINTAINED AS A tEXINFO MANUAL.
iF THE INFO AND TR PROGRAMS ARE PROPERLY INSTALLED AT YOUR SITE,
THE COMMAND INFO TR SHOULD GIVE YOU ACCESS TO THE COMPLETE MANUAL.
# 呀喝!猪羊变色。新档案 file-aA 的大写的字母转成小写字母。 简单的字母代替文字加密 在多人多任务的 UNIX 或 Linux OS 中,一般使用者其实很难保有隐私,因为永远还有一个人可以查看管理你的私人档案,那就是你的系统管理者。所以当你需要在这样一个公共空间里,保有一点基本的自我隐私时,文件最好为它加密。 tr 可以产生趣味大于实质用途的加密,方法简单如下 # tr 'a-z ' 'qazwsxedcrfvtgbyhnujmikolp' < file-Aa | tee file-SAa
SEEpALSO
TdspxjffpwgzjvstuqucgtpxghpuhpcnpvqctuqctswpqnpqpTskctxgpvqtjqf.p
Ixpudspctxgpqtwpuhpbhgehqvnpqhspbhgbshfopctnuqffswpqupogjhpncus,p
udspzgvvqtw pctxgpuh ndgjfwpecmspogjpqzzsnnpugpudspzgvbfsuspvqtjqf.p
# 为 了举例方便,密码字母集我只设定小写字母。如果真想用的话,最好将整个 ASCII 全部代替会比较理想。同时为了安全起见,指令不可在交谈模式下使用,因为程序有可能正被观察中,同时也必须注意history功能是否储存的密码字母集。 最好的方式是将程序写成 script 来执行,当然密码字母集不可包含在其中。 解密的过程只需将正确的密码字母集放到 SET1 将替换的程序反过来即可... # tr 'qazwsxedc rfvtgbyhnujmikolp' 'a-z ' < file-SAa
SEE ALSO
The full documentation for tr is maintained as a Texinfo manual.
If the info and tr programs are properly installed at your site,
the command info tr should give you access to the complete manual.
# 这种加密法适合 100 个字母以内的简短讯息使用,绝对可以蒙过一些小Q蛋,只是碰上频率分析法专家会被笑而已。 压缩过多的连续空白或空行 # tr -s ' ' ' ' < file 对空白过多的文本文件,这个做法可以简单迅速地解决。如果对象是空行,也可以使用 # tr -s '\n' '\n' < file 所以相似的问题,都可藉由 -s 选项做有效的缩减。 让转换参数做1对1的有效对应 有时一不小心 SET1 的范围指定多过对应到 SET2 的指定时,执行结果会有小问题,来看下例 # cat file-a
a
ab
abc
abcd efgh ijkl # tr 'a-z' '012' < file-a
0
01
012
0122 2222 2222 也就是说,SET1 对应到 SET2 的关系变成 a 转换成 0, b 转换成 1, c-z 转换成 2。通常,最后的 c-z 对应多半是设定时没有预料到的对应关系。 要避免或限制这种效应,可以加上 -t 选项 # tr -t 'a-z' '012' < file-a
0
01
012
012d efgh ijkl 因 -t 选项,使对应关系改变成 a 转换成 0, b 转换成 1, c 转换成 2, d-z 因 SET2 没有设定而不做任何转换对应。 

2、字符范围
指定字符串1或字符串2的内容时,只能使用单字符或字符串范围或列表。
[a-z] a-z内的字符组成的字符串。
[A-Z] A-Z内的字符组成的字符串。
[0-9] 数字串。
\octal 一个三位的八进制数,对应有效的ASCII字符。
[O*n] 表示字符O重复出现指定次数n。因此[O*2]匹配OO的字符串。
tr中特定控制字符的不同表达方式
速记符含义八进制方式
\a Ctrl-G 铃声\007
\b Ctrl-H 退格符\010
\f Ctrl-L 走行换页\014
\n Ctrl-J 新行\012
\r Ctrl-M 回车\015
\t Ctrl-I tab键\011
\v Ctrl-X \030

3、应用例子
(1)去除oops.txt里面的重复的小写字符
           tr -s "[a-z]"<oops.txt >result.txt
(2)删除空行
           tr -s "[\012]" < plan.txt    或 tr -s ["\n"] < plan.txt
(3)有时需要删除文件中的^M,并代之以换行
           tr -s "[\015]" "[\n]" < file 或 tr -s "[\r]" "[\n]" < file
(4)大写到小写
          cat a.txt |tr "[a-z]" "[A-Z]" >b.txt
(5)删除指定字符
    一个星期的日程表。任务是从其中删除所有数字,只保留日期。日期有大写,也有小写格式。因此需指定两个字符范围[a-z]和[A-Z],命令tr -cs "[a-z][A-Z]" "[\012*]" 将文件每行所有不包含在[a-z]或[A-Z](所有希腊字母)的字符串放在字符串1中并转换为一新行。-s选项表明压缩所有新行, -c表明保留所有字母不动。原文件如下,后跟tr命令:
     tr -cs "[a-z][A-Z]" "[\012*]" <diary.txt
(6)转换控制字符
     tr的第一个功能就是转换控制字符,特别是从dos向UNIX下载文件时,忘记设置ftp关于回车换行转换的选项时更是如此。cat -v filename 显示控制字符。
    cat -v stat.txt
    box aa^^^^^12^M
    apple bbas^^^^23^M
    ^Z
猜想‘^ ^ ^ ^ ^ ^’是tab键。每一行以Ctrl-M结尾,文件结尾Ctrl-Z,以下是改动方法。
使用-s选项,查看ASCII表。^的八进制代码是136,^M是015,tab键是011,^Z是032 ,下面将按步骤完成最终功能。
用tab键替换^ ^ ^ ^ ^ ^,命令为"\136" "[\011*]"。将结果重定向到临时工作文件stat.tmp
    tr -s "[\136]" "[\011*]" <stat.txt >stat.tmp
用新行替换每行末尾的^M,并用\n去除^Z,输入要来自于临时工作文件stat.tmp。
    tr -s "[\015][\032]" "\n" <stat.tmp
要删除所有的tab键,代之以空格,使用命令
    tr -s "[\011]" "[\040*]" <input.file

(7)替换passwd文件中所有冒号,代之以tab键,可以增加可读性
     tr -s "[:]" "[\011]" < /etc/passwd 或 tr -s "[:]" "[\t]" < /etc/passwd
(8)使路径具有可读性
        如果用 echo $PATH 或者 echo $LD_LIBRARY_PATH 等类似的命令来显示路径信息的话,我们看到的将会是一大堆用冒号连接在一起的路径, tr命令可以把这些冒号转换为回车,这样,这些路径就具有很好的可读性了
    echo $PATH | tr ":" "\n" 
(9)可以在vi内使用所有这些命令!只要记住:在tr命令前要加上您希望处理的行范围和感叹号 (!),如 1,$!tr -d '\t'(美元符号表示最后一行)。
(10)另外,当有人给您发送了一个在 Mac OS 或 DOS/Windows 机器上创建的文本文件时,您会发现tr非常有用。
    如果没有将文件保存为使用 UNIX 换行符来表示行结束这种格式,则需要将这样的文件转换成本机 UNIX 格式,否则一些命令实用程序不会正确地处理这些文件。Mac OS 的行尾以回车字符(\r)结束,许多文本处理工具将这样的文件作为一行来处理。为了纠正这个问题,可以用下列技巧: 
     Mac -> UNIX:tr "\r" "\n"<macfile > unixfile
     UNIX -> Mac:tr "\n" "\r"<unixfile > macfile
Microsoft DOS/Windows 约定,文本的每行以回车字符(\r)并后跟换行符(\n)结束。为了纠正这个问题,可以使用下列命令:
     DOS -> UNIX:tr -d "\r"<dosfile > unixfile
     UNIX -> DOS:在这种情况下,需要用awk,因为tr不能插入两个字符来替换一个字符。要使用的 awk 命令为 awk '{ print $0"\r" }'<unixfile > dosfile
注:都可以用sed 来完成。

原创粉丝点击