shell tr命令的使用


转自: http://fyan.iteye.com/blog/1172279



tr是translate的简写,亦即翻译,但是遗憾的是,它不能翻译句子,只能翻译单个字符。 

1 tr的工作原理是什么? 

先记住一点,tr命令不接受指定的文件参数,而只是对标准输入进行翻译。好了,记住这点后,我们继续。 

tr的命令格式是tr SET1 SET2,凡是在SET1中的字符,都会被替换为SET2中相应位置上的字符,简单吧! 

2 举个例子吧! 

tr的例子其实都大同小异,看一个最简单的例子: 

我们有一个包含了四个人身高的数据文件,名字叫height.txt,它的内容是这样的: 

[rocrocket@rocrocket programming]$ cat height.txt 
1.79 1.83 
1.65 1.59 

我们想搞一个恶作剧,将所有人的身高从1米级别都提高到2米级别,呵呵,一个tr就可以搞定。 
[rocrocket@rocrocket programming]$ tr 1 2 < height.txt 
2.79 2.83 
2.65 2.59 

希望你没有忘记,tr只处理标准输入,所以我们需要将height.txt通过重定向指到tr的标准输入才可以。 

3 我们可以用tr来修改文件中的间隔符么? 

Good idea! 

当使用cut的时候,通常会被间隔符问题所困扰,我们这个时候可以考虑到tr这个命令。 

还是以height.txt文件为例,其中的间隔符是空格,我们把它修改为制表符吧! 

[rocrocket@rocrocket programming]$ tr ‘ ‘ ‘\11′ < height.txt 
1.79    1.83 
1.65    1.59 

这里有一个小知识点,像制表符、换行符这些字符不好表示,我们可以考虑使用ASCII的八进制形式来表示,制表符的八进制形式是11,回车是15,换行是12。而在tr命令中,可以使用\nnn形式表示八进制形式的字符。如果你实在记不住这些编号,那么用\t表示制表符你总该可以记住吧!(\n代表新行,\r代表回车) 

这下,你应该可以理解上面那条命令的作用了吧。如果你仍然怀疑,那么,看看下面这条命令,你就该心服口服了: 

[rocrocket@rocrocket programming]$ tr ‘ ‘ ‘\11′ < height.txt |sed -n l 
1.79\t1.83$ 
1.65\t1.59$ 

看!空格的的确确被替换成了制表符喽! 

4 使用tr能把文章中的小写都转换成大写么? 

这个正是tr所擅长的地方。 

加入我们拥有一个文件叫做word.txt,里面包含的内容是AbcdE。 

那么最简单的替换大小写的方法是: 

[rocrocket@rocrocket programming]$ cat word.txt 
AbcdE 
[rocrocket@rocrocket programming]$ tr ‘a-z’ ‘A-Z’ < word.txt 
ABCDE 

5 [CHAR*]怎么用? 

这是 SET2 专用的设定,功能是重复指定的字符到与 SET1 相同长度为止 

例子: 

[rocrocket@rocrocket programming]$ cat number.txt 
1234567890 
[rocrocket@rocrocket programming]$ tr ‘1-5′ ‘[A*]‘ < number.txt 
AAAAA67890 

6 [CHAR*REPEAT]怎么用? 

这也是SET2专用的设定,功能是将CHAR重复REPEAT次数。其中REPEAT次数可以用八进制数表示,但记得要以0开头表示八进制数。 

例子: 

[rocrocket@rocrocket programming]$ tr ‘1-9′ ‘[A*5]BCDE’ < number.txt 
AAAAABCDE0 

7 在tr中还有哪些表示集合的符号呢? 

[:alnum:] :所有字母字符与数字 
[:alpha:] :所有字母字符 
[:blank:] :所有水平空格 
[:cntrl:] :所有控制字符 
[:digit:] :所有数字 
[:graph:] :所有可打印的字符(不包含空格符) 
[:lower:] :所有小写字母 
[:print:] :所有可打印的字符(包含空格符) 
[:punct:] :所有标点字符 
[:space:] :所有水平与垂直空格符 
[:upper:] :所有大写字母 
[:xdigit:] :所有 16 进位制的数字 

例子: 

将所有的数字都转换为字符x。 

[rocrocket@rocrocket programming]$ tr [:alnum:] ‘[x*]‘ < number.txt 
xxxxxxxxxx 

8 tr里面包含SET1和SET2,那如果出现两个集合的大小不同的情况,tr如何处理呢? 

这个问题,最好的解决办法就是做实验啊。 

第一种情况是SET1>SET2: 

[rocrocket@rocrocket programming]$ tr 1-5 AB < number.txt 
ABBBB67890 

结论一下子就出来了,SET1中多出来的字符都会和SET2中最后一个字符相对应。 

第二种情况SET1<SET2: 

[rocrocket@rocrocket programming]$ tr 1-3 ABCDE < number.txt 
ABC4567890 

很明了,SET2中多余的部分将被抛弃。 

9 讲一讲tr命令的-s选项吧! 

这个-s选项,是专门针对SET1起作用的,意思是如果发现有连续的SET1里的字符,就把它们缩减为1个。 

一个很经典的应用就是把不规律的空格缩减为一个空格: 

[rocrocket@rocrocket programming]$ cat spaces.txt 
How   are               you? 
Fine! Thank    you! 
[rocrocket@rocrocket programming]$ tr -s ‘ ‘ ‘ ‘ < spaces.txt 
How are you? 
Fine! Thank you! 

效果很明显,用户很满意。恩! 

10 -d选项咋用? 

-d选项是用来删除字符用的。格式是这样的:tr -d charset 

[rocrocket@rocrocket programming]$ tr -d ‘ ‘ < spaces.txt 
Howareyou? 
Fine!Thankyou! 

看,该有的空格都没了…这就是-d的作用,把空格都删除了! 

如果你想把文章中的数字都删除,就tr -d [0-9] < filename就可以了。 





语法: 
          tr [options]   [source-char-list]        [replace-char-list]      <    filename 
用途: 
    转换字符,例如:将大写字符转换成小写字符。选项可以让你指定所要删除的字符,以及将一串重复出现的字符浓缩成一个。 
常用选项: 
-c:   取source-char-list的反义,所有不在source-char-list中的字符。常与-d , -s配合使用。 
-d:   删除source-char-list中所定义的字符。 
-s:   浓缩重复的字符。如果标准输入中连续重复出现source-char-list里所列的字符,则将其浓缩成一个。或者将其浓缩成replace-char-list中的字符。 
tr 'X' 'x' 把所有大写X转换成小写x 
tr '()' '{}' 把( )替换成{ } 
tr '[a-z]' '[A-Z]' 把所有小写字母变成大写字母 
tr '[A-Z]' '[N-ZA-M]' 把字符A-M分别转换成N-Z,而N-Z转换成A-M 
tr -s ' ' ' ' 把多个空格转换成单个空格 
tr -d '[0-9]' 删除所有数字 





引用:[a-z] a-z内的字符组成的字符串。 
[A-Z] A-Z内的字符组成的字符串。 
[0-9] 数字串。 

/octal 一个三位的八进制数,对应有效的A S C I I字符。 
[O*n] 表示字符O重复出现指定次数n。因此[ O * 2 ]匹配O O的字符串。 
大部分t r变种支持字符类和速记控制字符。 
字符类格式为[:c l a s s ],包含数字、希腊字母、空行、小写、大写、c n t r l键、空格、点记符、图形等等。 

下表包括最常用的控制字符的速记方式及三位八进制引用方式。 
当用一个单字符替换一个字符串或字符范围时,注意字符并不放在方括号里( [ ])。一些系统也可以使用方括号,例如可以写成[“\ 0 1 2”]或“\ 0 1 2”,t r也允许不加引号,因此命令中看到单引号而不是双引号时也不要感到奇怪。 
像大多数系统工具一样, t r也受特定字符的影响。因此如果要匹配这些字符,需使用反斜线屏蔽其特殊含义。例如,用\ {指定花括号左边可以屏蔽其特殊含义。 


代码: 

速记符含义八进制方式 

\ a Ctrl-G 铃声\ 0 0 7 
\ b Ctrl-H 退格符\ 0 1 0 
\f Ctrl-L 走行换页\ 0 1 4 
\n Ctrl-J 新行\ 0 1 2 
\ r Ctrl-M 回车\ 0 1 5 
\t Ctrl-I tab键\ 0 11 
\ v Ctrl-X \ 0 3 0 


去除重复出现的字符 
下面文件包含了一些打印错误。这种情况时常发生,例如在v i编辑器中,偶尔按住一个键不放。 

代码: 
And the cowwwwws went homeeeeeeeeeeeee 
Or did theyyyyyyyyyyyyy 



如果要去除重复字母或将其压缩在一起,使用- s选项。因为都是字母,故使用[ a - z ][A-Z]。输入文件重定向到t r命令。 
dtdlut@dtdlut:~$ tr -s "[a-z][A-Z]" < apps.txt 
And the cows went home 
Or did they 



删除空行 
要删除空行,可将之剔出文件。下面是一个文件p l a n e . t x t。文本间有许多空行。 



plane.txt 
9879932 Spitfire 




190992 Lancaster 




238991 Typhoon 



dtdlut@dtdlut:~$ tr -s "\n" < plane.txt 
plane.txt 
9879932 Spitfire 
190992 Lancaster 
238991 Typhoon 


大写到小写 
除了删除控制字符,转换大小写是t r最常用的功能。为此需指定即将转换的小写字符[ a - z ]和转换结果[ A - Z ]。 
第一个例子,t r从一个包含大小写字母的字符串中接受输入。 

tr "[a-z]" "[A-Z]"      或者          tr "[:lower:]" "[:upper:]" 
dtdlut@dtdlut:~$ echo "May Day,May Day,Going Down.." | tr "[a-z]" "[A-Z]" 
MAY DAY,MAY DAY,GOING DOWN.. 


删除指定字符 
偶尔会从下载文件中删除只包含字母或数字的列。需要结合使用- c和- s选项完成此功能。 
下 面的文件包含一个星期的日程表。任务是从其中删除所有数字,只保留日期。日期有大写,也有小写格式。因此需指定两个字符范围[ a - z ]和[ A - Z ],命令tr    -cs         "[a-z][A-Z]"          "\n"将文件每行所有不包含在[ a - z ]或[ A - Z ](所有希腊字母)的字符串放在字符串replace-char-list中并转换为一新行。- s选项表明压缩所有新行, - c表明取source-char-list的反义。 
dtdlut@dtdlut:~$ cat diray.txt 
mondy 1all0:5b0 
Tuesday 15:00 
wednesday 15:30 
thurday 10:30 
Fridya 09:20 


dtdlut@dtdlut:~$ tr -cs "[a-z][A-Z]" "\n" < diray.txt 
mondy 
all 

Tuesday 
wednesday 
thurday 
Fridya 



linux中shell截取字符串方法总结


转自: http://www.111cn.net/sys/linux/43822.htm



shell中截取字符串的方法有很多中,可以分为两大类。第一种获取特定的字符或字符串的左边或者右边的字字符串,java中实现需要先用indexOf来确定特定字符串的位置,然后再用substring来获取结果;第二种类似java中的substring


shell中截取字符串的方法有很多中,

${expression}一共有9种使用方法。
${parameter:-word}
${parameter:=word}
${parameter:?word}
${parameter:+word} 
上面4种可以用来进行缺省值的替换。
${#parameter}
上面这种可以获得字符串的长度。 
${parameter%word} 最小限度从后面截取word
${parameter%%word} 最大限度从后面截取word
${parameter#word} 最小限度从前面截取word
${parameter##word} 最大限度从前面截取word
上面4个就是用来截取字符串的方法了。

有了着四种用法就不必使用cut命令来截取字符串了


第一种又可以分为四种情况,下面一一介绍。

1、使用 # 号操作符。用途是从左边开始删除第一次出现子字符串即其左边字符,保留右边字符。用法为#*substr,例如:

str='http://www.你的域名.com/cut-string.html'

echo ${str#*//}

得到的结果为www.你的域名.com/cut-string.html,即删除从左边开始到第一个"//"及其左边所有字符2、使用 ## 号操作符。用途是从左边开始删除最后一次出现子字符串即其左边字符,保留右边字符。用法为##*substr,例如:

str='http://www.你的域名.com/cut-string.html'

echo ${str##*/}

得到的结果为cut-string.html,即删除最后出现的"/"及其左边所有字符3、使用 % 号操作符。用途是从右边开始删除第一次出现子字符串即其右边字符,保留左边字符。用法为%substr*,例如:

str='http://www.你的域名.com/cut-string.html'

echo ${str%/*}

得到的结果为http://www.你的域名.com,即删除从右边开始到第一个"/"及其右边所有字符4、使用 %% 号操作符。用途是从右边开始删除最后一次出现子字符串即其右边字符,保留左边字符。用法为%%substr*,例如:

str='http://www.你的域名.com/cut-string.html'

echo ${str%%/*}

得到的结果为http://www.你的域名.com,即删除从右边开始到最后一个"/"及其右边所有字符第二种也分为四种,分别介绍如下:

1、从左边第几个字符开始以及字符的个数,用法为:start:len,例如:

str='http://www.你的域名.com/cut-string.html'

echo ${var:0:5}

其中的 0 表示左边第一个字符开始,5 表示字符的总个数。
结果是:http:2、从左边第几个字符开始一直到结束,用法为:start,例如:

str='http://www.你的域名.com/cut-string.html'

echo ${var:7}

其中的 7 表示左边第8个字符开始
结果是:www.你的域名.com/cut-string.html3、从右边第几个字符开始以及字符的个数,用法:0-start:len,例如:

str='http://www.你的域名.com/cut-string.html'
echo ${str:0-15:10}

其中的 0-6 表示右边算起第6个字符开始,10 表示字符的个数。
结果是:cut-string3、从右边第几个字符开始一直到结束,用法:0-start,例如:

str='http://www.你的域名.com/cut-string.html'
echo ${str:0-4}

其中的 0-6 表示右边算起第6个字符开始,10 表示字符的个数。
结果是:html注:(左边的第一个字符是用 0 表示,右边的第一个字符用 0-1 表示)

网上其它参考内容


一、Linux shell 截取字符变量的前8位,有方法如下:
1.expr substr “$a” 1 8
2.echo $a|awk ‘{print substr(,1,8)}’
3.echo $a|cut -c1-8
4.echo $
5.expr $a : ‘(.\).*’
6.echo $a|dd bs=1 count=8 2>/dev/null

二、按指定的字符串截取
1、第一种方法:
${varible##*string} 从左向右截取最后一个string后的字符串
${varible#*string}从左向右截取第一个string后的字符串
${varible%%string*}从右向左截取最后一个string后的字符串
${varible%string*}从右向左截取第一个string后的字符串
“*”只是一个通配符可以不要

例子:
$ MYVAR=foodforthought.jpg
$ echo ${MYVAR##*fo}
rthought.jpg
$ echo ${MYVAR#*fo}
odforthought.jpg

2、第二种方法:${varible:n1:n2}:截取变量varible从n1到n2之间的字符串。

可以根据特定字符偏移和长度,使用另一种形式的变量扩展,来选择特定子字符串。试着在 bash 中输入以下行:
$ EXCLAIM=cowabunga
$ echo ${EXCLAIM:0:3}
cow
$ echo ${EXCLAIM:3:7}
abunga

这种形式的字符串截断非常简便,只需用冒号分开来指定起始字符和子字符串长度。

三、按照指定要求分割:
比如获取后缀名
ls -al | cut -d “.” -f2



GitHub 加速计划 / li / linux-dash
10.39 K
1.2 K
下载
A beautiful web dashboard for Linux
最近提交(Master分支:2 个月前 )
186a802e added ecosystem file for PM2 4 年前
5def40a3 Add host customization support for the NodeJS version 4 年前
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐