shell的字符串截取

近期在編寫一個 sh 腳本時,又被 for 循環取兩個變量卡住了,雖然以前用 Python 實現過,可是 sh 總歸實現不了,今天又看了看 Python 的實現過程,發現原來 sh 也能夠這樣。html

現一文件內有以下內容,咱們將經過編寫 sh 腳原本逐行打印截取後的每一行內容centos

[root@centos-master string]# cat Ddate.txt 
startDate=2018-01-01 00:00:00=endDate=2018-01-31 23:59:59
startDate=2018-02-01 00:00:00=endDate=2018-02-31 23:59:59
startDate=2018-03-01 00:00:00=endDate=2018-03-31 23:59:59
startDate=2018-04-01 00:00:00=endDate=2018-04-31 23:59:59
startDate=2018-05-01 00:00:00=endDate=2018-05-31 23:59:59
startDate=2018-06-01 00:00:00=endDate=2018-06-31 23:59:59
startDate=2018-07-01 00:00:00=endDate=2018-07-31 23:59:59
startDate=2018-08-01 00:00:00=endDate=2018-08-31 23:59:59
startDate=2018-09-01 00:00:00=endDate=2018-09-31 23:59:59

首先咱們先編寫出逐行打印出文件內容的腳本以下bash

#!/bin/bash

cat /home/zyy/string/Ddate.txt | while read line
do
    startDate=${line}
    echo "$startDate"

done

運行結果以下所示spa

[root@centos-master string]# sh idate.sh  
startDate=2018-01-01 00:00:00=endDate=2018-01-31 23:59:59
startDate=2018-02-01 00:00:00=endDate=2018-02-31 23:59:59
startDate=2018-03-01 00:00:00=endDate=2018-03-31 23:59:59
startDate=2018-04-01 00:00:00=endDate=2018-04-31 23:59:59
startDate=2018-05-01 00:00:00=endDate=2018-05-31 23:59:59
startDate=2018-06-01 00:00:00=endDate=2018-06-31 23:59:59
startDate=2018-07-01 00:00:00=endDate=2018-07-31 23:59:59
startDate=2018-08-01 00:00:00=endDate=2018-08-31 23:59:59
startDate=2018-09-01 00:00:00=endDate=2018-09-31 23:59:59

接下來咱們就開始對遍歷出來的字符串進行截取操做。code

 

1、刪除左邊字符

一、= 號截取,刪除左邊字符,保留右邊字符htm

startDate=${line#*=}

其中 line 是變量名,# 號是運算符,*= 表示從左邊開始刪除第一個 = 號及左邊的全部字符

完整腳本以下blog

#!/bin/bash

cat /home/zyy/string/Ddate.txt | while read line
do
    startDate=${line#*=}
    echo "$startDate"
done

運行結果字符串

[root@centos-master string]# sh idate.sh  
2018-01-01 00:00:00=endDate=2018-01-31 23:59:59
2018-02-01 00:00:00=endDate=2018-02-31 23:59:59
2018-03-01 00:00:00=endDate=2018-03-31 23:59:59
2018-04-01 00:00:00=endDate=2018-04-31 23:59:59
2018-05-01 00:00:00=endDate=2018-05-31 23:59:59
2018-06-01 00:00:00=endDate=2018-06-31 23:59:59
2018-07-01 00:00:00=endDate=2018-07-31 23:59:59
2018-08-01 00:00:00=endDate=2018-08-31 23:59:59
2018-09-01 00:00:00=endDate=2018-09-31 23:59:59

 

二、## 號截取,刪除左邊字符,保留右邊字符get

startDate=${line##*=}

其中 line 是變量名,## 是運算符,*= 表示從左邊開始刪除最後(最右邊)一個 = 號及左邊的全部字符

完整腳本以下string

#!/bin/bash

cat /home/zyy/string/Ddate.txt | while read line
do
    startDate=${line##*=}
    echo "$startDate"
done

運行結果

[root@centos-master string]# sh idate.sh  
2018-01-31 23:59:59
2018-02-31 23:59:59
2018-03-31 23:59:59
2018-04-31 23:59:59
2018-05-31 23:59:59
2018-06-31 23:59:59
2018-07-31 23:59:59
2018-08-31 23:59:59
2018-09-31 23:59:59

 

2、刪除右邊字符

三、% 號截取,刪除右邊字符,保留左邊字符

startDate=${line%=*}

其中 line 是變量名,% 是運算符,=* 表示從右邊開始,刪除第一個 = 號及右邊的字符

完整腳本以下

#!/bin/bash

cat /home/zyy/string/Ddate.txt | while read line
do
    startDate=${line%=*}
    echo "$startDate"
done

運行結果

[root@centos-master string]# sh idate.sh  
startDate=2018-01-01 00:00:00=endDate
startDate=2018-02-01 00:00:00=endDate
startDate=2018-03-01 00:00:00=endDate
startDate=2018-04-01 00:00:00=endDate
startDate=2018-05-01 00:00:00=endDate
startDate=2018-06-01 00:00:00=endDate
startDate=2018-07-01 00:00:00=endDate
startDate=2018-08-01 00:00:00=endDate
startDate=2018-09-01 00:00:00=endDate

 

四、%% 號截取,刪除右邊字符,保留左邊字符

startDate=${line%%=*}

其中 line 是字符串,%% 是運算符,=* 表示從右邊開始,刪除最後(最左邊)一個 = 號及右邊的字符

完整腳本以下

#!/bin/bash

cat /home/zyy/string/Ddate.txt | while read line
do
    startDate=${line%%=*}
    echo "$startDate"
done

運行結果

[root@centos-master string]# sh idate.sh  
startDate
startDate
startDate
startDate
startDate
startDate
startDate
startDate
startDate

 

3、從左邊定位字符

五、從左邊第幾個字符開始,及字符的個數

startDate=${line:0:20}

其中 0 表示從左邊第一個字符開始,20 表示字符的總個數

完整腳本以下

#!/bin/bash

cat /home/zyy/string/Ddate.txt | while read line
do
    startDate=${line:0:20}
    echo "$startDate"
done

運行結果

[root@centos-master string]# sh idate.sh    
startDate=2018-01-01
startDate=2018-02-01
startDate=2018-03-01
startDate=2018-04-01
startDate=2018-05-01
startDate=2018-06-01
startDate=2018-07-01
startDate=2018-08-01
startDate=2018-09-01

 

六、從左邊第幾個字符開始,一直到結束

startDate=${line:30}

其中 30 表示從左邊第 31 個字符開始,一直到結束

完整腳本以下

#!/bin/bash

cat /home/zyy/string/Ddate.txt | while read line
do
    startDate=${line:30}
    echo "$startDate"
done

運行結果

[root@centos-master string]# sh idate.sh  
endDate=2018-01-31 23:59:59
endDate=2018-02-31 23:59:59
endDate=2018-03-31 23:59:59
endDate=2018-04-31 23:59:59
endDate=2018-05-31 23:59:59
endDate=2018-06-31 23:59:59
endDate=2018-07-31 23:59:59
endDate=2018-08-31 23:59:59
endDate=2018-09-31 23:59:59

 

4、從右邊定位字符

七、從右邊第幾個字符開始,及字符的個數

startDate=${line:0-19:10}

其中 0-19 表示從右邊算起第十九個字符開始,10 表示字符的個數

完整腳本以下

#!/bin/bash

cat /home/zyy/string/Ddate.txt | while read line
do
    startDate=${line:0-19:10}
    echo "$startDate"
done

運行結果

[root@centos-master string]# sh idate.sh  
2018-01-31
2018-02-31
2018-03-31
2018-04-31
2018-05-31
2018-06-31
2018-07-31
2018-08-31
2018-09-31

 

八、從右邊第幾個字符開始,一直到結束

startDate=${line:0-19}

其中 0-19 表示從右邊開始第 19 個字符起,一直到結束

# 注: 左邊的第一個字符是用 0 表示,右邊的第一個字符用 0-1 表示

完整腳本以下

#!/bin/bash

cat /home/zyy/string/Ddate.txt | while read line
do
    startDate=${line:0-19}
    echo "$startDate"

done

運行結果

[root@centos-master string]# sh idate.sh  
2018-01-31 23:59:59
2018-02-31 23:59:59
2018-03-31 23:59:59
2018-04-31 23:59:59
2018-05-31 23:59:59
2018-06-31 23:59:59
2018-07-31 23:59:59
2018-08-31 23:59:59
2018-09-31 23:59:59

 

 

 

 

參考資料

1. Shell腳本8種字符串截取方法總結

相關文章
相關標籤/搜索