推荐给好友 上一篇 | 下一篇

Shell常用处理字符串方法

XJ;zx:? ^6zV'r一、构造字符串BSD爱好者乐园g,OZET0h/uDQ

)N}1o(f)d8[:dM直接构造BSD爱好者乐园6E)^ M|#Y;w6N/P
STR_ZERO=helloBSD爱好者乐园 X;Qx$G {y2\
STR_FIRST="i am a string"BSD爱好者乐园:l/{i2YIO~/FB$S
STR_SECOND='success'BSD爱好者乐园 v\nn&yo$t8dF2P

BSD爱好者乐园)h(_L#i1c

重复多次BSD爱好者乐园(G4\ s:^1`;z:XoBe
#repeat the first parm($1) by $2 timesBSD爱好者乐园 WnAWbe!Xt-me
strRepeat()
*DKD/v2\,[{BSD爱好者乐园'a/J(x6_7Zp)_4F
local x=$2BSD爱好者乐园#b:L| Y m
if [ "$x" == "" ]; then
j@*Zpox=0BSD爱好者乐园sXt!` NPT5F%im
fiBSD爱好者乐园9@pMQ~0A`9W&w

BSD爱好者乐园)z-Di\f

local STR_TEMP=""BSD爱好者乐园(C$e4V9Wp(R~&M{;b4T
while [ $x -ge 1 ];
;Y4_pE3G0vXdo
f3_&R I1mo'c@:TSTR_TEMP=`printf "%s%s" "$STR_TEMP" "$1"`
0n*T4q'o"aCJ^(Y9Lx=`expr $x - 1`
%b^ E8_~#EdoneBSD爱好者乐园)SM6[J#kO
echo $STR_TEMP
k@N'@/uMmJ}BSD爱好者乐园&M5n.]#g|

#d8k%]%W8w7U(Y举例:
+E$LI Ig1KY&]1V.}6Vx;ASTR_REPEAT=`strRepeat "$USER_NAME" 3`
hZ2EtfKecho "repeat = $STR_REPEAT"BSD爱好者乐园:\VOY;b Ig

BSD爱好者乐园%^5l7C,?5f

二、赋值与拷贝

j-c$K3}&l3Jf

Q6V.W t#`.U直接赋值BSD爱好者乐园 P(n0g l z
与构造字符串一样
2\]9o1o)o.bU)IUSER_NAME=terry

e#o-m,v7F5P.BBSD爱好者乐园 n-{6P8Kb

从变量赋值BSD爱好者乐园X8W2c!b#^6j*yt\-V-Q
ALIASE_NAME=$USER_NAME

%nW.~O-QP

"?*kmc$Z!q J9ag三、联接

vPC4t&n/y2ZWBSD爱好者乐园?'XJ'z,G

直接联接两个字符串BSD爱好者乐园 NJ A@'U nU"`
STR_TEMP=`printf "%s%s" "$STR_ZERO" "$USER_NAME"`
.W#bNiX,xJ'x使用printf可以进行更复杂的联接

5p1T gTnBSD爱好者乐园h A0eg/eF}

四、求长BSD爱好者乐园j8tmPD

BSD爱好者乐园0oU6D t+H

求字符数(char)BSD爱好者乐园6DKQDQ!X"a
COUNT_CHAR=`echo "$STR_FIRST" | wc -m`
l\)Y7]@echo $COUNT_CHAR

S1g+Ap2n4G [ P"rBSD爱好者乐园9]9xU.Hd&s

求字节数(byte)BSD爱好者乐园1c9S#v4D5@6fN5D{
COUNT_BYTE=`echo "$STR_FIRST" | wc -c`BSD爱好者乐园f lej(U(b
echo $COUNT_BYTE

WA,k p"D,R1R

Y4z\"z&__求字数(word)
H'k+o+I;}h'_*f1}]COUNT_WORD=`echo "$STR_FIRST" | wc -w`
P#x9zM@2NR pR Aecho $COUNT_WORD

e;Pk_x v"e;OBSD爱好者乐园6}w9JY.k!F

五、比较

Sf(M.T JF v rb'IBSD爱好者乐园rxV`%|.f

相等比较
l*C-^!D1emp2~str1 = str2BSD爱好者乐园w!R2Rv'J Fkw8B

BSD爱好者乐园'ASTd:cq'nE6z5\Z

不等比较
-b0dzr$gG o$Astr1 != str2BSD爱好者乐园b:Lw c;p

D ~&d1m?举例:BSD爱好者乐园v(M7u NK8d'lg {#T
if [ "$USER_NAME" = "terry" ]; then
3n;T*J,_t Iecho "I am terry"BSD爱好者乐园Q"P YDH%\ w4E
fi

;i*ul.i5q `{:HU1S/H:K\

&?/Q0X6n-jy小于比较BSD爱好者乐园#rhcE5pG{'X
#return 0 if the two string is equal, return 1 if $1 < $2, else 2strCompare() { local x=0 if [ "$1" != "$2" ]; then x=2 localTEMP=`printf "%sn%s" "$1" "$2"` local TEMP2=`(echo "$1"; echo "$2") |sort` if [ "$TEMP" = "$TEMP2" ]; then x=1 fi fi echo $x }BSD爱好者乐园 A zlc-a]E4jO3p

z SQ` MS0UZ K六、测试BSD爱好者乐园(YE.of*d)\0p

9EK Y(w@ H0OI判空BSD爱好者乐园o,F&S&Vk
-z strBSD爱好者乐园'J"I"? fr-~qM

BSD爱好者乐园#? py3x"E;[tg

判非空BSD爱好者乐园Q2Ns C)Gl
-n strBSD爱好者乐园,k]0FvP-\RT

6T/|4gC'm!j H是否为数字BSD爱好者乐园f dt]p
# return 0 if the string is num, otherwise 1BSD爱好者乐园;M b^T3S9H
strIsNum()
R*aq[&T{BSD爱好者乐园$cjW;oD`T5z
local RET=1BSD爱好者乐园`0u)T2W `D
if [ -n "$1" ]; then
:@"ab6W'T'@9o$olocal STR_TEMP=`echo "$1" | sed 's/[0-9]//g'`BSD爱好者乐园yC%R-wS z6\'j,cIy
if [ -z "$STR_TEMP" ]; thenBSD爱好者乐园5JYIdXz9n
RET=0
"t Jt'H_9uG+I(} Pfi
(? w8S#~HfiBSD爱好者乐园@ ^W(b4yf$E
echo $RET
9Z'{({[:m Kf2`}

1Rq \|,EwBSD爱好者乐园W;d8] b*j F/\R/{8N[.Ya

举例:BSD爱好者乐园+e$l?c,NN'|"YW
if [ -n "$USER_NAME" ]; then
|.]4Pqe#Jm;i2V4e qecho "my name is NOT empty"
H F'A/L}Z9E Zfi

t(m,Pl*g%O| xKe']3E0?+xBSD爱好者乐园;^m\ l CDVG

echo `strIsNum "9980"`

1A9y(mX R|x@B

QawP*T七、分割

KOawJV3i1cmk){BSD爱好者乐园sVV2jP

以符号+为准,将字符分割为左右两部分BSD爱好者乐园yC5i_)E0Qt'N
使用sedBSD爱好者乐园D2Y+tH1ob
举例:
Z)BKL l命令 date --rfc-3339 seconds 的输出为
PZ;^lP"M~9i2007-04-14 15:09:47+08:00BSD爱好者乐园+XU \Ko1B8Y _ltJ?
取其+左边的部分BSD爱好者乐园^-U+hNP;B,Y
date --rfc-3339 seconds | sed 's/+[0-9][0-9]:[0-9][0-9]//g'BSD爱好者乐园7}"c`jR}}
输出为BSD爱好者乐园 I)Y"u#}*d;H6E
2007-04-14 15:09:47BSD爱好者乐园As*R7Z%f jb&^
取+右边的部分BSD爱好者乐园h/D&w.?y*\[ L
date --rfc-3339 seconds | sed 's/.*+//g'BSD爱好者乐园&V$tFIZRL1M
输出为BSD爱好者乐园kt oQ3@w/e;G8r.z
08:00

{4N+w5A:D

.w't.W F6w#k(e以空格为分割符的字符串分割BSD爱好者乐园(W3^ut6N {t(|
使用awk
W:q)hKIB举例:
CM*j#zy;oSTR_FRUIT="Banana 0.89 100"BSD爱好者乐园 K!VNY p)H'i
取第3字段
-q8yQ0_\5R%E1p%a4R5_echo $STR_FRUIT | awk '{ print $3; }'BSD爱好者乐园@)wSI+t-cB;So

FV/y:z h,T&c0~八、子字符串BSD爱好者乐园8Z p-`P\V W(K

?4y$P'B.je/HNk字符串1是否为字符串2的子字符串
#X _R"{]b'H Pj# return 0 is $1 is substring of $2, otherwise 1
3WLx p,i xFD^n^ castrIsSubstring()BSD爱好者乐园0Fs"_2b\
{BSD爱好者乐园A |BC8^0Q8^*|Sw
local x=1
:JL,b5e R)v,|"icase "$2" in
~CKLXM*$1*) x=0;;
5yv,r0xwZ Besac
H/ROFfe:DI@echo $xBSD爱好者乐园1l,{3w.BHaF8{j:NiO
}

|?(t y*v.{_

!n.z8j0tLj#^一、Linux shell 截取字符变量的前8位,有方法如下:

\*A*z Q9Ug%`"jI$wBSD爱好者乐园(}6MN&t} N/F`

1.expr substr “$a” 1 8BSD爱好者乐园-e!_"}*_`4Z@Bu\
2.echo $a|awk ‘{print substr(,1,8)}’BSD爱好者乐园3^8x(jc#J8]9P g dJ
3.echo $a|cut -c1-8BSD爱好者乐园-t$KX"Ol,l)joP
4.echo $BSD爱好者乐园Q%}&OTL-h1R({
5.expr $a : ‘(.).*’
.so/UCA/M6.echo $a|dd bs=1 count=8 2>/dev/null

f%q6\,P;c0yBSD爱好者乐园&a0a L/CFE1K xQ

二、按指定的字符串截取BSD爱好者乐园A"Z(D3fp%E K ^G

\U*l5e0H1、第一种方法:

u4En d$^a!e
  • ${varible##*string} 从左向右截取最后一个string后的字符串
  • ${varible#*string}从左向右截取第一个string后的字符串
  • ${varible%%string*}从右向左截取最后一个string后的字符串
  • ${varible%string*}从右向左截取第一个string后的字符串
BSD爱好者乐园 ~GZ5p'I;T2{.p

“*”只是一个通配符可以不要

0~'Bt6n2r5PBSD爱好者乐园S9Qp"h E,L1x7z3y

例子:
F#~:@aM:t.Ap"^-F$ MYVAR=foodforthought.jpgBSD爱好者乐园cnf Kr9P:Q
$ echo ${MYVAR##*fo}
tI(x M&Ct5I6uS.?rthought.jpg
(?jKe7n @7T;^$ echo ${MYVAR#*fo}BSD爱好者乐园%c:` [/O^?#v
odforthought.jpg

!Y&\.\*^jdBSD爱好者乐园 x$_bY W9g9OZ

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

%U\G#}S"QD SBSD爱好者乐园ui|9`^&gS;C

可以根据特定字符偏移和长度,使用另一种形式的变量扩展,来选择特定子字符串。试着在 bash 中输入以下行:
2}r%T?)H jh N$ EXCLAIM=cowabungaBSD爱好者乐园2dKBt%e0AQk
$ echo ${EXCLAIM:0:3}BSD爱好者乐园:arbsud1v4|
cowBSD爱好者乐园?3JSO)R3T
$ echo ${EXCLAIM:3:7}BSD爱好者乐园^(~E.fmt z2YS
abungaBSD爱好者乐园$i @ {?6}

BSD爱好者乐园(I(M&J$k`} ~ V%G

这种形式的字符串截断非常简便,只需用冒号分开来指定起始字符和子字符串长度。BSD爱好者乐园;V}:L } UCTy3d%i:M+aP

f5H z0AX三、按照指定要求分割:BSD爱好者乐园S8s'Vl)\S
比如获取后缀名BSD爱好者乐园;z!i.g]o@y
ls -al | cut -d “.” -f2

$l ywb,j`%f3i
[版权声明]BSD爱好者乐园站内文章,如来源不是互联网,则均系原创或翻译之作,可随意转载,或以此为基础进行演译,但务必以链接形式注明原始出处和作者信息,否则属于侵权行为。另对本站转载他处文章,俱有说明,如有侵权请联系本人,本人将会在第一时间删除侵权文章。
TAG: shell 字符串
查看全部1条评论

最新评论

  • 删除 Guest (2010-5-11 22:01:49, 评分: 5 )

    5
 

评分:0

我来说两句

seccode