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种字符串截取方法总结

相关文章
相关标签/搜索