利用tr命令轻松实现大小写转换(1)


系统工程师有时候在系统维护的时候,需要将某个文件中的内容进行大小写的转换。如系统工程师从网上下载了一个脚本文件。但是脚本文件的主人有个怪癖,对于一些备注的内容希望采用大写字母来描述。这可能跟某些工程师的阅读习惯不一致。为此需要将这些大写字符转换写小写字母。当然,系统工程师可以手工的一个个进行修改。但是,显然操作起来很麻烦。为此系统工程师就会想,在Unix操作系统中是否提供了类似的工具,可以将大写字符转换为小写字母呢?确实,在Unix操作系统中提供了一个tr命令。这是一个强盗的字符转换命令,可以实现包括字符大小写转换在内地很多功能。

一、tr字符变换命令的基本格式格式要求。

在Unix操作系统中,针对整行的内容或者字段的命令有很多。相比之下,对一行中的字符进行操作的命令却比较少。这并不是说对字符操作不重要。而是因为tr这个字符变换命令就可以实现大部分字符处理的功能。这个命令的主要功能就是对字符串进行替换。如下图所示,笔者就是使用tr命令,先将一个文件中的字母a全部使用字母c来代替。然后第二个例子就是想文件中的小写字符全部转换为大写字符。

这个命令的基本格式为tr 可选项 参数1 参数2 标准输入

这个命令的可选项虽然不是很多,但是都比较使用。通常搭配不同的可选项,可以实现不同的功能。另外在这个命令中,有一个比较特殊的部分,即标准输出。这是什么意思呢?而且在这个命令中没有文件名这个参数。那么如果将一个文件中的内容转换为英文字符呢?原来,这个命令只接受标准输入,而不接受文件名作为参数。为此如果要将某个文件中的内容进行大小写转换时,就需要按照上面的格式,先将文件中的内容读取出来,然后再利用管道符等工具将读取出来的内容传递给命令tr。然后再利用这个tr命令进行大小写转换或者进行简单的字符替换。在使用标准输入的时候,系统工程师即可以将标准输入放在这个命令的尾部。也可以使用管道符将标准输入放在命令的开头。笔者比较喜欢的是将标准输入放在命令开头。这两个方式都可以,没有什么差异。主要是看系统工程师的习惯而定。

二、实现大小写转换。

笔者上面提到的第二个案例就是将文件text.txt中内容进行大小写转换。将文件中所有小写字符转换成大写。笔者采用的命令是head –n -2 text.txt | tr ‘[a-z]’ ‘[A-Z]’。由于这个命令不支持文件名作为其参数,而支持标准输入。为此笔者就用head命令读取文件的前面几行。由于一些脚本文件往往是将这个脚本的功能说明放置在文件的开头,所以利用head命令来读取文本的前面几行是合理的。如此的话,就可以避免对整个脚本文件进行转换。要知道shell对大小写是敏感的。如果对一些命令和参数进行了一些不恰当的转换,有可能会出现莫名其妙的错误。为此只需要对脚本文件前面几行的注释部分进行大小写转换即可。

另外笔者在这个命令中用到一些具有特殊意义的元字符,如[]等等。在参数中如果遇到元字符的话,往往需要采用转义或者引用的机制,来告诉操作系统将这些字符当作普通字符来对待。一般情况下,系统工程师如果对他们不需要进行变量取值或者命令替换时,必须要使用单引号等引用或者转移字符。根据笔者上篇文章谈到过的双引号与单引号的相互保护作用,系统工程师还可以将命令中的表达式赋值给两个变量。然后将变量放置在双引号中,求其变量的值。

三、替换某些特定的字符。

在Unix操作系统中有一类比较特殊的文件,即lst文件。这个文件跟表格文件非常的类似,都是使用分隔符来分隔各个字段。默认情况下,这个分隔符没有固定的限制。如可以使用|符号来进行分隔,也可以使用空格符或者TAB键来进行分隔。也就算说,各位读者可以根据自己的需要来设置分隔符。不过这给文件共享带来了麻烦。因为一个文件按一定的分隔符号建立完成后,下次阅读时就只能够按照这个分隔符号。如果要采用其他的分隔符的话,就需要进行手工的调整。现在假设一个项目团队中的工程师A喜欢采用-分隔符,而另外一个工程师则喜欢采用|分隔符。那该怎么办呢?难道需要一个个去更换呢?

其实要实现这个转换的方式还是比较多的。如可以使用查找命令配合循环语句,将这个文件中的所有-符号都转换成|符号。不过利用循环语句与查找替换命令来实现这个功能的话有点复杂,并一定每个系统工程师都可以在短时间内写出这么复杂的语句。其实采用这个tr命令就可以轻松的将这件事情搞定。如利用tr ‘-‘ ‘|’即可。另外如果系统工程师想删除这个分隔符,也是可以的。只需要采用一个可选项-d,就可以将所有的-分隔符去掉。


相关内容