精华内容
下载资源
问答
  • 转 -- linux中shell截取字符串方法总结

    万次阅读 2016-11-25 11:58:43
    linux中shell截取字符串方法总结 shell中截取字符串的方法有很多中,可以分为两大类。第一种获取特定的字符或字符串的左边或者右边的字字符串,java中实现需要先用indexOf来确定特定字符串的位置,然后再用...

    参考一下。

    原址如下:

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


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

    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



    ============== 另外一篇:

    原址如下:

    http://justcoding.iteye.com/blog/1963463

    linux shell 字符串操作详解 (长度,读取,替换,截取,连接,对比,删除,位置 )

    在做shell批处理程序时候,经常会涉及到字符串相关操作。有很多命令语句,如:awk,sed都可以做字符串各种操作。 其实shell内置一系列操作符号,可以达到类似效果,大家知道,使用内部操作符会省略启动外部程序等时间,因此速度会非常的快。

     

    一、判断读取字符串值

    表达式 含义
    ${var} 变量var的值, 与$var相同
       
    ${var-DEFAULT} 如果var没有被声明, 那么就以$DEFAULT作为其值 *
    ${var:-DEFAULT} 如果var没有被声明, 或者其值为空, 那么就以$DEFAULT作为其值 *
       
    ${var=DEFAULT} 如果var没有被声明, 那么就以$DEFAULT作为其值 *
    ${var:=DEFAULT} 如果var没有被声明, 或者其值为空, 那么就以$DEFAULT作为其值 *
       
    ${var+OTHER} 如果var声明了, 那么其值就是$OTHER, 否则就为null字符串
    ${var:+OTHER} 如果var被设置了, 那么其值就是$OTHER, 否则就为null字符串
       
    ${var?ERR_MSG} 如果var没被声明, 那么就打印$ERR_MSG *
    ${var:?ERR_MSG} 如果var没被设置, 那么就打印$ERR_MSG *
       
    ${!varprefix*} 匹配之前所有以varprefix开头进行声明的变量
    ${!varprefix@} 匹配之前所有以varprefix开头进行声明的变量

    加入了“*”  不是意思是: 当然, 如果变量var已经被设置的话, 那么其值就是$var.

     

     

    二、字符串操作(长度,读取,替换)

    表达式 含义
    ${#string} $string的长度
       
    ${string:position} 在$string中, 从位置$position开始提取子串
    ${string:position:length} 在$string中, 从位置$position开始提取长度为$length的子串
       
    ${string#substring} 从变量$string的开头, 删除最短匹配$substring的子串
    ${string##substring} 从变量$string的开头, 删除最长匹配$substring的子串
    ${string%substring} 从变量$string的结尾, 删除最短匹配$substring的子串
    ${string%%substring} 从变量$string的结尾, 删除最长匹配$substring的子串
       
    ${string/substring/replacement} 使用$replacement, 来代替第一个匹配的$substring
    ${string//substring/replacement} 使用$replacement, 代替所有匹配的$substring
    ${string/#substring/replacement} 如果$string的前缀匹配$substring, 那么就用$replacement来代替匹配到的$substring
    ${string/%substring/replacement} 如果$string的后缀匹配$substring, 那么就用$replacement来代替匹配到的$substring
       

    说明:"* $substring”可以是一个正则表达式.

     

     实例:

     

    读取:

    Java代码  收藏代码
    1. $ echo ${abc-'ok'}  
    2. ok  
    3. $ echo $abc  
    4. $ echo ${abc='ok'}  
    5. ok  
    6. $ echo $abc  
    7. ok  
    8.   
    9. #如果abc 没有声明“=" 还会给abc赋值。  
    10. $ var1=11;var2=12;var3=  
    11. $ echo ${!v@}             
    12. var1 var2 var3  
    13. $ echo ${!v*}  
    14. var1 var2 var3  
    15.   
    16. #${!varprefix*}与${!varprefix@}相似,可以通过变量名前缀字符,搜索已经定义的变量,无论是否为空值。  

     

    1,取得字符串长度

    C代码  收藏代码
    1. string=abc12342341          //等号二边不要有空格  
    2. echo ${#string}             //结果11  
    3. expr length $string         //结果11  
    4. expr "$string" : ".*"       //结果11 分号二边要有空格,这里的:根match的用法差不多  
     

     2,字符串所在位置

    C代码  收藏代码
    1. expr index $string '123'    //结果4 字符串对应的下标是从1开始的   
     
    C代码  收藏代码
    1. str="abc"  
    2. expr index $str "a"  # 1  
    3. expr index $str "b"  # 2  
    4. expr index $str "x"  # 0  
    5. expr index $str ""   # 0   

     

    这个方法让我想起来了js的indexOf,各种语言对字符串的操作方法大方向都差不多,如果有语言基础的话,学习shell会很快的。

     

    3,从字符串开头到子串的最大长度

    C代码  收藏代码
    1. expr match $string 'abc.*3' //结果9    
     

    个人觉得这个函数的用处不大,为什么要从开头开始呢。

     

    4,字符串截取

    C代码  收藏代码
    1. echo ${string:4}      //2342341  从第4位开始截取后面所有字符串    
    2. echo ${string:3:3}    //123      从第3位开始截取后面3位    
    3. echo ${string:3:6}    //123423   从第3位开始截取后面6位    
    4. echo ${string: -4}    //2341  :右边有空格   截取后4位    
    5. echo ${string:(-4)}   //2341  同上    
    6. expr substr $string 3 3   //123  从第3位开始截取后面3位    

     

    C代码  收藏代码
    1. str="abcdef"  
    2. expr substr "$str" 1 3  # 从第一个位置开始取3个字符, abc  
    3. expr substr "$str" 2 5  # 从第二个位置开始取5个字符, bcdef   
    4. expr substr "$str" 4 5  # 从第四个位置开始取5个字符, def  
    5.   
    6. echo ${str:2}           # 从第二个位置开始提取字符串, bcdef  
    7. echo ${str:2:3}         # 从第二个位置开始提取3个字符, bcd  
    8. echo ${str:(-6):5}        # 从倒数第二个位置向左提取字符串, abcde  
    9. echo ${str:(-4):3}      # 从倒数第二个位置向左提取6个字符, cde  

     

    上面的方法让我想起了,php的substr函数,后面截取的规则是一样的。

     

    5,匹配显示内容

    C代码  收藏代码
    1. //例3中也有match和这里的match不同,上面显示的是匹配字符的长度,而下面的是匹配的内容    
    2. expr match $string '\([a-c]*[0-9]*\)'  //abc12342341    
    3. expr $string : '\([a-c]*[0-9]\)'       //abc1    
    4. expr $string : '.*\([0-9][0-9][0-9]\)' //341 显示括号中匹配的内容    

     

    这里括号的用法,是不是根其他的括号用法有相似之处呢,

     

    6,截取不匹配的内容

    C代码  收藏代码
    1. echo ${string#a*3}     //42341  从$string左边开始,去掉最短匹配子串    
    2. echo ${string#c*3}     //abc12342341  这样什么也没有匹配到    
    3. echo ${string#*c1*3}   //42341  从$string左边开始,去掉最短匹配子串    
    4. echo ${string##a*3}    //41     从$string左边开始,去掉最长匹配子串    
    5. echo ${string%3*1}     //abc12342  从$string右边开始,去掉最短匹配子串    
    6. echo ${string%%3*1}    //abc12     从$string右边开始,去掉最长匹配子串    
     
    C代码  收藏代码
    1. str="abbc,def,ghi,abcjkl"  
    2. echo ${str#a*c}     # 输出,def,ghi,abcjkl  一个井号(#) 表示从左边截取掉最短的匹配 (这里把abbc字串去掉)  
    3. echo ${str##a*c}    # 输出jkl,             两个井号(##) 表示从左边截取掉最长的匹配 (这里把abbc,def,ghi,abc字串去掉)  
    4. echo ${str#"a*c"}   # 输出abbc,def,ghi,abcjkl 因为str中没有"a*c"子串  
    5. echo ${str##"a*c"}  # 输出abbc,def,ghi,abcjkl 同理  
    6. echo ${str#*a*c*}   # 空  
    7. echo ${str##*a*c*}  # 空  
    8. echo ${str#d*f)     # 输出abbc,def,ghi,abcjkl,   
    9. echo ${str#*d*f}    # 输出,ghi,abcjkl     
    10.   
    11. echo ${str%a*l}     # abbc,def,ghi  一个百分号(%)表示从右边截取最短的匹配   
    12. echo ${str%%b*l}    # a             两个百分号表示(%%)表示从右边截取最长的匹配  
    13. echo ${str%a*c}     # abbc,def,ghi,abcjkl    
     

    这里要注意,必须从字符串的第一个字符开始,或者从最后一个开始,可以这样记忆, 井号(#)通常用于表示一个数字,它是放在前面的;百分号(%)卸载数字的后面; 或者这样记忆,在键盘布局中,井号(#)总是位于百分号(%)的左边(即前面)  。

     

    7,匹配并且替换

    C代码  收藏代码
    1. echo ${string/23/bb}   //abc1bb42341  替换一次    
    2. echo ${string//23/bb}  //abc1bb4bb41  双斜杠替换所有匹配    
    3. echo ${string/#abc/bb} //bb12342341   #以什么开头来匹配,根php中的^有点像    
    4. echo ${string/%41/bb}  //abc123423bb  %以什么结尾来匹配,根php中的$有点像   

     

    C代码  收藏代码
    1. str="apple, tree, apple tree"  
    2. echo ${str/apple/APPLE}   # 替换第一次出现的apple  
    3. echo ${str//apple/APPLE}  # 替换所有apple  
    4.   
    5. echo ${str/#apple/APPLE}  # 如果字符串str以apple开头,则用APPLE替换它  
    6. echo ${str/%apple/APPLE}  # 如果字符串str以apple结尾,则用APPLE替换它  
     
    C代码  收藏代码
    1. $ test='c:/windows/boot.ini'  
    2. $ echo ${test/\//\\}  
    3. c:\windows/boot.ini  
    4. $ echo ${test//\//\\}  
    5. c:\windows\boot.ini  
    6.   
    7. #${变量/查找/替换值} 一个“/”表示替换第一个,”//”表示替换所有,当查找中出现了:”/”请加转义符”\/”表示。  
     

    8. 比较

    C代码  收藏代码
    1. [[ "a.txt" == a* ]]        # 逻辑真 (pattern matching)  
    2. [[ "a.txt" =~ .*\.txt ]]   # 逻辑真 (regex matching)  
    3. [[ "abc" == "abc" ]]       # 逻辑真 (string comparision)   
    4. [[ "11" < "2" ]]           # 逻辑真 (string comparision), 按ascii值比较  
     

    9. 连接

    C代码  收藏代码
    1. s1="hello"  
    2. s2="world"  
    3. echo ${s1}${s2}   # 当然这样写 $s1$s2 也行,但最好加上大括号  
     
    10. 字符串删除
    Java代码  收藏代码
    1. $ test='c:/windows/boot.ini'  
    2. $ echo ${test#/}  
    3. c:/windows/boot.ini  
    4. $ echo ${test#*/}  
    5. windows/boot.ini  
    6. $ echo ${test##*/}  
    7. boot.ini  
    8.   
    9. $ echo ${test%/*} 
    10. c:/windows 
    11. $ echo ${test%%/*} 
    12.  
    13. #${变量名#substring正则表达式}从字符串开头开始配备substring,删除匹配上的表达式。 
    14. #${变量名%substring正则表达式}从字符串结尾开始配备substring,删除匹配上的表达式。 
    15. #注意:${test##*/},${test%/*} 分别是得到文件名,或者目录地址最简单方法。   










    展开全文
  • linux中shell截取字符串方法总结

    千次阅读 2013-08-16 17:11:18
    tr是translate的简写,亦即翻译,但是遗憾的是,它不能翻译句子,只能翻译单个字符。  1 tr的工作原理是什么?  先记住一点,tr命令不接受指定的文件参数,而只是对标准输入进行翻译。好了,记住这点后,我们...

    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



    展开全文
  • Linux shell 脚本中截取字符串

    千次阅读 2019-08-14 16:44:33
    1. 用参数截取字符串 假设有一个变量var=http://blog.csdn.net/sayhello_world 1.1 # 号截取,删除左边字符,保留右边字符。 echo ${var#*//} 其中: var 是变量名,# 号是运算符,*// 表示从左边开始删除第一个 //...

    1. 用参数截取字符串

    假设有一个变量var=http://blog.csdn.net/sayhello_world

    1.1 # 号截取,删除左边字符,保留右边字符。

    echo ${var#*//}
    

    其中:
    var 是变量名,# 号是运算符,*// 表示从左边开始删除第一个 // 号及左边的所有字符
    即删除 http://
    结果是 :blog.csdn.net/sayhello_world

    1.2 ## 号截取,删除左边字符,保留右边字符。

    echo ${var##*/}
    

    ##*/ 表示从左边开始删除最后(最右边)一个 / 号及左边的所有字符
    即删除 http://blog.csdn.net/
    留下sayhello_world

    1.3 %号截取,删除右边字符,保留左边字符。

    echo ${var%/*}
    

    %/* 表示从右边开始,删除第一个 / 号及右边的字符
    这里删除/sayhello_world
    留下http://blog.csdn.net

    1.4 %% 号截取,删除右边字符,保留左边字符。

    echo ${var%%/*}
    

    %%/* 表示从右边开始,删除最后(最左边)一个 / 号及右边的字符
    结果是:http:

    1.5 从左边第几个字符开始,及字符的个数。

    echo ${var:0:7}
    

    其中的 0 表示左边第一个字符开始,7表示字符的总个数。
    结果是:http://

    1.6 从左边第几个字符开始,一直到结束。

    echo ${var:7}
    

    其中的 7 表示左边第8个字符开始,一直到结束。
    结果是 :blog.csdn.net/sayhello_world

    1.7 从右边第几个字符开始,及字符的个数。

    echo ${var:0-5:5}
    

    其中的 0-5表示右边算起第五个字符开始,5表示字符的个数。
    结果是:world

    1.8 从右边第几个字符开始,一直到结束。

    echo ${var:0-15}
    

    表示从右边第十五个字符开始,一直到结束。
    结果是:/sayhello_world

    注:
    左边的第一个字符是用 :0 表示,右边的第一个字符用 :0-1 表示

    2. 用cut工具截取

    cut可以将一段新的某一段“切”出来,处理的信息是以“行”为单位。

    参数 含义
    -d 后面接分割字符,与-f一起使用
    -f 依据-d的分割字符将一段信息切割成为数段,用-f取出几段的意思
    -c 以字符的单位取出固定字符区间

    例如一个字符串“sayhello_world”
    在这里插入图片描述

    cut的主要用途以及不足
    cut主要的用途在于将同一行里面的数据进行分解,最常使用在分析一些数据或文字数据的时候。这是因为有时候我们会以某些字符当作切割的函数,然后来将数据加以切割,以取得我们所需要的数据。

    如果文件里面的某些域是由若干个空格来间隔的,那么用cut就有点麻烦了,因为cut只擅长处理“以一个字符间隔”的文本内容。—

    展开全文
  • Linux字符串截取

    2009-12-08 14:57:24
    Linux 字符串 字符串截取 方法很多很实用
  • Linux--shell脚本中截取字符串

    千次阅读 2017-07-09 11:00:08
    用参数截取字符串假设有一个变量var=http://blog.csdn.net/sayhello_world 1.# 号截取,删除左边字符,保留右边字符。 echo ${var#*//}其中 var 是变量名,# 号是运算符,*// 表示从左边开始删除第一个 // 号及...

    用参数截取字符串

    假设有一个变量var=http://blog.csdn.net/sayhello_world
    1.# 号截取,删除左边字符,保留右边字符。
    这里写图片描述

    echo ${var#*//}

    其中 var 是变量名,# 号是运算符,*// 表示从左边开始删除第一个 // 号及左边的所有字符
    即删除 http://
    结果是 :blog.csdn.net/sayhello_world
    这里写图片描述

    2.## 号截取,删除左边字符,保留右边字符。

    echo ${var##*/}

    ##*/ 表示从左边开始删除最后(最右边)一个 / 号及左边的所有字符
    即删除 http://blog.csdn.net/
    留下sayhello_world
    这里写图片描述

    3.%号截取,删除右边字符,保留左边字符。

    echo ${var%/*}

    %/* 表示从右边开始,删除第一个 / 号及右边的字符
    这里删除/sayhello_world
    留下http://blog.csdn.net
    这里写图片描述

    4. %% 号截取,删除右边字符,保留左边字符。

    echo ${var%%/*}

    %%/* 表示从右边开始,删除最后(最左边)一个 / 号及右边的字符
    结果是:http:
    这里写图片描述

    5.从左边第几个字符开始,及字符的个数。

    echo ${var:0:7}

    其中的 0 表示左边第一个字符开始,7表示字符的总个数。
    结果是:http://
    这里写图片描述

    6.从左边第几个字符开始,一直到结束。

    echo ${var:7}

    其中的 7 表示左边第8个字符开始,一直到结束。
    结果是 :blog.csdn.net/sayhello_world
    这里写图片描述

    7.从右边第几个字符开始,及字符的个数。

    echo ${var:0-5:5}

    其中的 0-5表示右边算起第五个字符开始,5表示字符的个数。
    结果是:world
    这里写图片描述

    8.从右边第几个字符开始,一直到结束。

    echo ${var:0-15}

    表示从右边第十五个字符开始,一直到结束。
    结果是:/sayhello_world
    这里写图片描述

    注:(左边的第一个字符是用 :0 表示,右边的第一个字符用 :0-1 表示)

    用cut工具截取

    cut可以将一段新的某一段“切”出来,处理的信息是以“行”为单位。

    参数 含义
    -d 后面接分割字符,与-f一起使用
    -f 依据-d的分割字符将一段信息切割成为数段,用-f取出几段的意思
    -c 以字符的单位取出固定字符区间

    例如一个字符串“sayhello_world”
    这里写图片描述

    cut的主要用途以及不足

    cut主要的用途在于将同一行里面的数据进行分解,最常使用在分析一些数据或文字数据的时候。这是因为有时候我们会以某些字符当作切割的函数,然后来将数据加以切割,以取得我们所需要的数据。

    如果文件里面的某些域是由若干个空格来间隔的,那么用cut就有点麻烦了,因为cut只擅长处理“以一个字符间隔”的文本内容。

    展开全文
  • 使用sed:sed -E 's/.*\/(.*)-.*/\1/' plainlinks999999-94092999999-94094999999-94096999999-94097999999-94098999999-94644999999-94645999999-94995999999-94996999999-96404要将更改保存到文件,请使用-i选项:...
  • 总体语法为 ...#从左边数第3个字符开始, 截取长度为5的字符串; 注意索引是从0开始 echo ${aaa:2:5} #截取结果为c123q #从右边数第4个字符开始, 截取长度为3的字符串 echo ${aaa:0-4:3} #截取结果为qwe ...
  • 参 数:-b忽略每行前面开始出的空格字符。-c检查文件是否已经按照顺序排序。-f排序时,忽略大小写字母。-M将前面3个字母依照月份的缩写进行排序。-n依照数值的大小排序。-o<输出文件>将排序后的结果存入指定...
  • DOS截取文本字符串

    2018-10-11 16:31:38
    说明:在编写windows是经常会遇到需要截取文本的功能,在linux中可以使用强大的awk、cut等命令实现。windows中也有类似的命令,使用起来比较麻烦 C:\Users\User&gt;set str=123456789 #定义字符串变量 C:\...
  • 最近在工作中要实现这样一个功能:从一个文本...先介绍一下strtok这个函数原型:char *strtok(char *src, char *flag)参数一是你要截取字符串,参数2是字符串中的分隔符。看一下linux的man手册是如何结束这个函数...
  • LINUX 字符串截取及切割

    千次阅读 2019-06-04 08:00:41
    使用Shell完成各种Linux运维任务时,一旦涉及到判断、条件测试等相关操作时,往往需要对相关的命令输出进行过滤,提取出符合要求的字符串。 本案例要求熟悉字符串的常见处理操作,完成以下任务练习: 参考PPT示范...
  • ${file#*/}:删掉第一个/ 及其左边的字符串:dir1/dir2/dir3/my.file.txt ${file##*/}:删掉最后一个/ 及其左边的字符串:my.file.txt ${file#*.}:删掉第一个. 及其左边的字符串:file.txt ${...
  • Linux字符串截取命令
  • 截取字符串-1aa="`ifconfig eth0 | grep 'inet addr' | awk '{print $2}'`"echo $aa | grep -o '[0-9]+.[0-9]+.[0-9]+.[0-9]+'...
  • Linux字符串截取很有用。有八种方法。 假设有变量 var=http://www.hao.com/123.htm 一 # 号截取,删除左边字符,保留右边字符。 echo ${var#*//} 其中 var 是变量名,# 号是运算符,*//...
  • 字符串比较那块儿出的问题,flag一直是0. 好心人顺便给看看是怎么个情况吧 。 经高人指点,用一行linux命令解决了问题 命令如下   cat *|awk -F[\/] '{print $3}'|sort -u >>gwdns 分开解释...
  • C语言中通过分隔符来截取字符串

    千次阅读 2015-12-24 13:42:04
    最近在工作中要实现这样一个功能: 从一个文本文件中按行读取数据,一行数据中每一列都可能含有空格,所以你要把空格给截取出来。列之间是通过TAB键分割...参数一是你要截取字符串,参数2是字符串中的分隔符。
  • root@master:~# b="ma name is yjt"root@master:~# echo ${#b}14字符串截取shell截取字符串通常有两种方式:从指定位置开始截取和从指定字符(子字符串)开始截取从指定位置开始截取从字符串左边开始计数:如...
  • 定义一个变量SCHOOL,并确认其字符串长度: [root@svr5 ~]# SCHOOL="Tarena IT Group." [root@svr5 ~]# echo ${#SCHOOL} 16 //包括16个字符(含空格) 使用${}截取时,起始位置可以省略,省略时从第一个...
  • Linux--shell中字符串截取

    千次阅读 2017-08-02 23:16:45
    1.在linux字符串截取我们可以用一个命令叫做cut,cut主要截取方法有三种 1)字节(bytes),用选项-b ,使用方法cut -b/c/f  2)字符(characters),用选项-c  3)域(fields),用选项-f 2.以字节定位 1...
  • 从一个文本文件中按行读取数据,一行数据中每一列都可能含有空格,所以你要把空格给截取出来。列之间是通过TAB键分割的。...参数一是你要截取字符串,参数2是字符串中的分隔符。 看一下linux的man手册是如何结束
  • 文件input.txt中有以下数据: line1\ line2 line3 cat input.txt | while read line do echo $line | awk '{print $1}' done 输出结果为: ...AWK如何处理字符串中包含转义字符的问题?
  • Linux下实现字符串截取,大体上可以分为两种,使用命令实现截取,使用工具实现截取。具体截取方式如下: a、#截取,可以实现删除左边字符,保留右边字符 从左边第一个</>开始,删除</>及之前的所有字符...
  • 字符串: 开始字符串:face=Arial 结束字符串:babababababababa 输出: 输出上面两个字符串之间的数据。 ​注:因为是从网上扒下来很多数据,要解析出特定字符串间的数据。 如何编程实现,或者用...
  • Linux文本处理、关键字截取

    千次阅读 2017-08-31 14:50:47
    cutcut命令可以将一行文字按照指定字符切分成多段...cut -c 区间 //取出指定字符位置的字符串,区间用-表示,如2-4,8-,-9等实例: 1 从登录信息中取出登录名那一列。[root@localhost nta]# last | cut -d ' ' -f1 ro
  • shell字符串的截取的问题: 一、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
  • 在学过sed、awk这类功能强大的文本流处理命令后,面对简单字符串处理,往往会忘记一种更高效简洁的方法,它就是SHELL内置的字符串处理。1、字符串的判断与赋值。表达式含义${var}变量var的值,,我们常用的$var就是它...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 13,533
精华内容 5,413
关键字:

linux处理文本截取字符串

linux 订阅