shell expr match


expr match "$pwrdm_stat" ".*,\($pwr_state:[0-9]*\)" 不理解

 

從字符串開始的位置匹配子串的長度

   expr match "$string" '$substring' $substring是一個正則表達式
   expr "$string" : '$substring'  $substring是一個正則表達式
 
expr match "$string" '\($substring\)'
從$string的開始位置提取$substring,$substring是一個正則表達式.   
expr "$string" : '\($substring\)'
從$string的開始位置提取$substring,$substring是一個正則表達式.
stringZ=abcABC123ABCabc   
     echo ` expr match "$stringZ" '\(.[b-c]*[A-Z]..[0-9]\)' `   # abcABC1
     echo ` expr "$stringZ" : '\(.[b-c]*[A-Z]..[0-9]\)' `     # abcABC1
     echo ` expr "$stringZ" : '\(.......\)' `           # abcABC1
 
所以:
expr match "$pwrdm_stat" ".*,\($pwr_state:[0-9]*\)"
. 代表一定有一個任意字符
* 代表重復零到無窮多個前一個字符
 
pwr_state=xx
# expr match "1233,xx:99xxx" ".*,\($pwr_state:[0-9]*\)"
.*, 一個任意字符 重復零到無窮多個前一個字符(重復3次任意字符) 外加一個逗號,
提取xx:[0-9]* 表示xx:后跟0-9任意一個數字,*表示重復零到無窮多個前一個字符
 輸出結果為:xx:99

 
 
轉自 https://www.cnblogs.com/tychyg/p/5067453.html 備用

shell字符串操作技巧

操作字符串
--------------
Bash支持超多的字符串操作,操作的種類和數量令人驚異.但不幸的是,這些工具缺乏集中性.
一些是參數替換的子集,但是另一些則屬於UNIX的expr命令.這就導致了命令語法的不一致和
功能的重疊,當然也會引起混亂.
 
1、字符串長度
  ${#string}
  expr length $string
  expr "$string" : '.*'
   
  stringZ=abcABC123ABCabc
   
  echo ${#stringZ}                
  echo `expr length $stringZ`     
  echo `expr "$stringZ" : '.*'`   
 
2、從字符串開始的位置匹配子串的長度
  expr match "$string" '$substring' $substring是一個正則表達式
  expr "$string" : '$substring'  $substring是一個正則表達式
   
  stringZ=abcABC123ABCabc
  echo `expr match "$stringZ" 'abc[A-Z]*.2'`  
  echo `expr "$stringZ" : 'abc[A-Z]*.2'`      
3、索引
    expr index $string $substring 匹配到子串的第一個字符的位置.
    stringZ=abcABC123ABCabc
    echo `expr index "$stringZ" C12`            
 
    echo `expr index "$stringZ" 1c`             
    # 'c' (in #3 position) matches before '1'.
 
    在C語言中最近的等價函數為strchr().
提取子串
        ${string:position}
        在string中從位置$position開始提取子串.
        如果$string為"*""@",那么將提取從位置$position開始的位置參數,[1]
    ${string:position:length}
        在string中從位置$position開始提取$length長度的子串.
 
################################StartScript######################################
stringZ=abcABC123ABCabc
#       0123456789.....
#       0-based indexing.
 
echo ${stringZ:0}                            # abcABC123ABCabc
echo ${stringZ:1}                            # bcABC123ABCabc
echo ${stringZ:7}                            # 23ABCabc
echo ${stringZ:7:3}                          # 23A
                                             # 3個字符長度的子串.
# 有沒有可能從字符結尾開始,反向提取子串?
     
echo ${stringZ:-4}                           # abcABC123ABCabc
# 以${parameter:-default}方式,默認是提取完整地字符串.
# 然而 . . .
echo ${stringZ:(-4)}                         # Cabc
echo ${stringZ: -4}                          # Cabc
# 現在,它可以工作了.
# 使用圓括號或者添加一個空格來轉義這個位置參數.
 
如果$string參數為"*""@",那將最大的提取從$position開始的$length個位置參數.
 
    echo ${*:2}          # Echo出第2個和后邊所有的位置參數.
    echo ${@:2}          # 與前邊相同.
    echo ${*:2:3}        # 從第2個開始,Echo出后邊3個位置參數.
    expr substr $string $position $length
        在string中從位置$position開始提取$length長度的子串.
    stringZ=abcABC123ABCabc
    #       123456789......
    #       1-based indexing.
     
    echo `expr substr $stringZ 1 2`              # ab
    echo `expr substr $stringZ 4 3`              # ABC
     
    expr match "$string" '\($substring\)'
        從$string的開始位置提取$substring,$substring是一個正則表達式.
     
    expr "$string" : '\($substring\)'
        從$string的開始位置提取$substring,$substring是一個正則表達式.
    stringZ=abcABC123ABCabc
     
    echo `expr match "$stringZ" '\(.[b-c]*[A-Z]..[0-9]\)'`   # abcABC1
    echo `expr "$stringZ" : '\(.[b-c]*[A-Z]..[0-9]\)'`       # abcABC1
    echo `expr "$stringZ" : '\(.......\)'`                   # abcABC1
    # All of the above forms give an identical result.
子串削除
    ${string#substring}
         從$string的左邊截掉第一個匹配的$substring
    ${string##substring}
         從$string的左邊截掉最后一個個匹配的$substring
    stringZ=abcABC123ABCabc
    #       |----|
    #       |----------|
     
    echo ${stringZ#a*C}      # 123ABCabc
    # 截掉'a''C'之間最近的匹配.
     
    echo ${stringZ##a*C}     # abc
    # 截掉'a''C'之間最遠的匹配.
         
     
    ${string%substring}
         從$string的右邊截掉第一個匹配的$substring
    ${string%%substring}
         從$string的右邊截掉最后一個匹配的$substring
 
    stringZ=abcABC123ABCabc
    #                    ||
    #        |------------|
     
    echo ${stringZ%b*c}      # abcABC123ABCa
    # 從$stringZ的后邊開始截掉'b''c'之間的最近的匹配
     
    echo ${stringZ%%b*c}     # a
    # 從$stringZ的后邊開始截掉'b''c'之間的最遠的匹配
 
Example 9-11 利用修改文件名,來轉換圖片格式
################################StartScript######################################
 #!/bin/bash
 #  cvt.sh:
 #  把一個目錄下的所有MacPaint格式的圖片文件都轉換為"pbm"格式的圖片文件.
  
 #  使用來自"netpbm"包的"macptopbm"程序,
 #+ 這個程序主要是由Brian Henderson(bryanh@giraffe-data.com)來維護的.
 #  Netpbm是大多數Linux發行版的標准部分.
  
 OPERATION=macptopbm
 SUFFIX=pbm          # 新的文件名后綴
  
 if [ -n "$1" ]
 then
   directory=$1      # 如果目錄名作為第1個參數給出...
 else
   directory=$PWD    # 否則使用當前的工作目錄.
 fi 
    
 #  假設在目標目錄中的所有文件都是MacPaint格式的圖片文件,
 #+ 以".mac"為文件名的后綴.
  
 for file in $directory/*    # Filename globbing.
 do
   filename=${file%.*c}      #  去掉文件名的".mac"后綴
                             #+ ('.*c' matches everything
                             #+ ('.*c' 將匹配'.'和'c'之間的任何字符串).
 
   $OPERATION $file > "$filename.$SUFFIX"
                             # 轉換為新的文件名.
   rm -f $file               # 轉換完畢后刪除原有的文件.
   echo "$filename.$SUFFIX"  # 從stdout輸出反饋.
 done
  
 exit 0
  
 
 #  修改這個腳本,讓他只轉換以".mac"為后綴的文件.
################################EndScript#######################################
        一個簡單的模擬getopt命令的辦法就是使用子串提取結構.
Example 9-12 模仿getopt命令
################################StartScript######################################
 #!/bin/bash
 # getopt-simple.sh
 # Author: Chris Morgan
 # 授權使用在ABS Guide中.
  
  
 getopt_simple()
 {
     echo "getopt_simple()"
     echo "Parameters are '$*'"
     until [ -z "$1" ]
     do
       echo "Processing parameter of: '$1'"
       if [ ${1:0:1} = '/' ]
       then
           tmp=${1:1}               # 去掉開頭的'/' . . .
           parameter=${tmp%%=*}     # 提取名字.
           value=${tmp##*=}         # 提取值.
           echo "Parameter: '$parameter', value: '$value'"
           eval $parameter=$value
       fi
       shift
     done
 }
  
 # 傳遞所有的選項到getopt_simple().
 getopt_simple $*
  
 echo "test is '$test'"
 echo "test2 is '$test2'"
  
 exit 0
  
 ---
  
 sh getopt_example.sh /test=value1 /test2=value2
  
 Parameters are '/test=value1 /test2=value2'
 Processing parameter of: '/test=value1'
 Parameter: 'test', value: 'value1'
 Processing parameter of: '/test2=value2'
 Parameter: 'test2', value: 'value2'
 test is 'value1'
 test2 is 'value2'
################################EndScript#######################################
子串替換
    ${string/substring/replacement}
        使用$replacement來替換第一個匹配的$substring.
    ${string//substring/replacement}
        使用$replacement來替換所有匹配的$substring.
 
    1 stringZ=abcABC123ABCabc
    2
    3 echo ${stringZ/abc/xyz}           # xyzABC123ABCabc
    4                                   # 用'xyz'來替換第一個匹配的'abc'.
    5
    6 echo ${stringZ//abc/xyz}          # xyzABC123ABCxyz
    7                                   # 用'xyz'來替換所有匹配的'abc'.
 
    ${string/#substring/replacement}
        如果$substring匹配$string的開頭部分,那么就用$replacement來替換$substring.
    ${string/%substring/replacement}
        如果$substring匹配$string的結尾部分,那么就用$replacement來替換$substring.
    1 stringZ=abcABC123ABCabc
    2
    3 echo ${stringZ/#abc/XYZ}          # XYZABC123ABCabc
    4                                   # 用'XYZ'替換開頭的'abc'
    5
    6 echo ${stringZ/%abc/XYZ}          # abcABC123ABCXYZ
    7                                   # 用'XYZ'替換結尾的'abc'
 
 
9.2.1 使用awk來操作字符串
~~~~~~~~~~~~~~~~~~~~~~~~~
Bash腳本也可以使用awk來操作字符串.
Example 9-13 提取字符串的一種可選的方法
################################StartScript######################################
 #!/bin/bash
 # substring-extraction.sh
  
 String=23skidoo1
 #      012345678    Bash
 #      123456789    awk
 # 注意,對於awk和Bash來說,它們使用的是不同的string索引系統:
 # Bash的第一個字符是從'0'開始記錄的.
 # Awk的第一個字符是從'1'開始記錄的.
  
 echo ${String:2:4} # 位置3 (0-1-2), 4 個字符長
                                          # skid
  
 # awk中等價於${string:pos:length}的命令是substr(string,pos,length).
 echo | awk '
 { print substr("'"${String}"'",3,4)      # skid
 }
 '
 #  使用一個空的"echo"通過管道給awk一個假的輸入,
 #+ 這樣可以不用提供一個文件名.

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM