利用tr命令轻松实现大小写转换
来源:考试大 ? 2009/6/22 ?【考试大:中国教育考试第一门户】???模拟考场???视频课程
系统工程师有时候在系统维护的时候,需要将某个文件中的内容进行大小写的转换。如系统工程师从网上下载了一个脚本文件。但是脚本文件的主人有个怪癖,对于一些备注的内容希望采用大写字母来描述。这可能跟某些工程师的阅读习惯不一致。为此需要将这些大写字符转换写小写字母。当然,系统工程师可以手工的一个个进行修改。但是,显然操作起来很麻烦。为此系统工程师就会想,在Unix操作系统中是否提供了类似的工具,可以将大写字符转换为小写字母呢?确实,在Unix操作系统中提供了一个tr命令。这是一个强盗的字符转换命令,可以实现包括字符大小写转换在内地很多功能。
一、tr字符变换命令的基本格式格式要求。
在Unix操作系统中,针对整行的内容或者字段的命令有很多。相比之下,对一行中的字符进行操作的命令却比较少。这并不是说对字符操作不重要。而是因为tr这个字符变换命令就可以实现大部分字符处理的功能。这个命令的主要功能就是对字符串进行替换。如下图所示,笔者
就是使用tr命令,先将一个文件中的字母a全部使用字母c来代替。然后第二个例子就是想文件中的小写字符全部转
这个命令的基本格式为tr 可选项 参数1 参数2 标准输入
这个命令的可选项虽然不是很多,但是都比较使用。通常搭配不同的可选项,可以实现不同的功能。另外在这个命令中,有一个比较特殊的部分,即标准输出。这是什么意思呢?而且在这个命令中没有文件名这个参数。那么如果将一个文件中的内容转换为英文字符呢?原来,这个命令只接受标准输入,而不接受文件名作为参数。为此如果要将某个文件中的内容进行大小写转换时,就需要按照上面的格式,先将文件中的内容读取出来,然后再利用管道符等工具将读取出来的内容传递给命令tr。然后再利用这个tr命令进行大小写转换或者进行简单的字符替换。在使用标准输入的时候,系统工程师即可以将标准输入放在这个命令的尾部。也可以使用管道符将标准输入放在命令的开头。笔者比较喜欢的是将标准输入放在命令开头。这两个方式都可以,没有什么差异。主要是看系统工程师的习惯而定。
二、实现大小写转换。
笔者上面提到的第二个案例就是将文件中内容进行大小写转换。将文件中所有小写字符转换成大写。笔者采用的命令是head –n - | tr ‘[a-z]’ ‘[A-Z]’。由于这个命令不支持文件名作为其参数,而支持标准输入。为此笔者就用head命令读取文件的前面几行。由于一些脚本文件往往是将这个脚本的功能说明放置在文件的开头,所以利用head命令来读取文本的前面几行是合理的。如此的话,就可以避免对整个脚本文件进行转换。要知道shell对大小写是敏感的。如果对一些命令和参数进行了一些不恰当的转换,有可能会出现莫名其妙的错误。为此只需要对脚本文件前面几行的注释部分进行大小写转换即可。
另外笔者在这个命令中用到一些具有特殊意义的元字符,如[]等等。在参数中如果遇到元字符的话,往往需要采用转义或者引用的机制,来告诉操作系统将这些字符当作普通字符来对待。一般情况下,系统工程师如果对他们不需要进行变量取值或者命令替换时,必须要使用单引号等引用或者转移字符。根据笔者上篇文章谈到过的双引号与单引号的相互保护作用,系统工程师还可以将命令中的表达式赋值给两个变量。然后将变量放置在双引号中,求其变量的值。
三、替换某些特定的字符。
在Unix操作系统中有一类比较特殊的文件,即lst文件。这个文件跟表格文件非常的类似,都是使用分隔符来分隔各个字段。默认情况下,这个分隔符没有固定的限制。如可以使用|符号来进行分隔,也可以使用空格符或者TAB键来进行分隔。也就算说,各位读者可以根据自己的需要来设置分隔符。不过这给文件共享带来了麻烦。因为一个文件按一定的分隔符号建立完成后,下次阅读时就只能够按照这个分隔符号。如果要采用其他的分隔符的话,就需要进行手工的调整。现在假设一个项目团队中的工程师A喜欢采用-分隔符,而另外一个工程师则喜欢采用|分隔符。那该怎么办呢?难道需要一个个去更换呢?
也可以用单引号引起来 其实要实现这个转换的方式还是比较多的。如可以使用查命令配合循环语句,将这个文件中的所有-符号都转换成|符号。不过利用循环语句与查替换命令来实现这个功能的话有点复杂,并一定每个系统工程师都可以在短时间内写出这么复杂的语句。其实采用这个tr命令就可以轻松的将这件事情搞定。如利用 tr ‘-‘ ‘|’即可。另外如果系统工程师想删除这个分隔符,也是可以的。只需要采用一个可选项-d,就可以将所有的-分隔符去掉。
另外如果采用-s可选项还可以压缩多个连续的字符。如可以压缩处理系统命令输出结果中的多个连续空格等等。如采用-c可选项可用于求表达式中字符的补集等等。而且最让人惊奇的
是,这几个可选项结合使用,还可以实现一些比较复杂的功能。各位读者回去可以想一下,如果想删除某几个特定字符以外的一些字符,该入如何实现呢?笔者提醒一下,结合采用可选贤-c与-d可以实现这个需求。大家可以回去测试一下。
四、使用这个命令的注意事项。
1、众所周知,在Unix操作系统中,无论是文件名还是目录名,又或者是命令,对于大小写都是敏感的。这根微软操作系统有很大的不同。为此在这个命令中,需要用到两个参数。在这个参数中大小写也是敏感的。如tr a c与tr A c具有不同的含义。第一个命令是将小写的英文字符a利用小写的英文字符c来替换。而第二个命令表示利用小写的英文字符c去替换所有大写的英文字符A。为此笔者提醒各位系统工程师,在使用这个命令的时候第一个主要注意的就是参数的大小写一定要一致。否则的话,很难达到预计的效果。
2、两个字符串中长度需要相同。通常情况下采用这个命令会将第一个参数中的字符变换成第二个参数中的相应字符。也就是说,利用第二个参数中的第一个字符替换成第一个参数中的第一个字符,依此类推,其他字符也按照这个规则进行替换。此时,如果两个参数的长度不相等的话,那么会出现什么情况呢?如 tr abc ab。此时第一个参数表达式将不到对应的
字符。即系统不知道将字符c利用什么字符来代替。为此在使用这个命令时,要确保两个参数的长度必须相等。
3、利用变量提高脚本程序的可用性。有时候系统工程师可能需要经常用到类似的转换功能。如使用这个命令可以简单的实现一些文件的加密作业。如可以预先将英文字符、数字等等建立一个一一对应的关系。然后写完内容之后,可以利用tr命令将文本转换为毫无意义的一个文件。如果不知道这种对应关系的话,那么其他用户即使得到这个文件也不能够破译出到底这个文本想表示什么内容。然后知道这个对应关系的用户,拿到这个文件后,再次反向执行一下这个命令(即将前后两个参数位置对调一下),就可以将文本的内容转换成原先的内容。如果建立好这个脚本之后,就可以重复利用这个脚不程序来对一些文件进行简单的加密。但是要提高其安全性的话,往往需要不断的对这个对应的规则进行调整。此时是否需要更改脚本文件呢?其实不用。因为这个tr命令支持变量。其实就是将命令中的两个参数分别赋值给两个变量。然后在执行命令的时候让系统分别对这两个变量求值,得出正确的对应规则。如此的话,当需要更改对应规则时,不需要改变这个脚本。只需要修改这两个变量的值即可。
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论