您的位置:首页 > 运维架构 > Shell

shell脚本的字符串匹配

2013-12-06 10:18 281 查看
今天遇到了这样的一个问题:

在一个有几百行的模板文件中,我想找出具有vendor=xxxxx&&yyyyyy模式的行并把这个xxxxx替换成大写

那么为了方便说明问题,我举个例子,比如我有文件test,内容为:

aa=aavalue&&bb=bbvalue

aa=aa2value&&bb=bb2value

aa=aa3value&&bb=bb3value

cc=mmmmmmm&&dd=nnnnnnnnn

ee=ssssssss&&ffttttttttt

我现在希望把aa=xxxxxx&&bb=yyyyy中的xxxxxx截取出来,然后转换成大写,最后在脚本中进行相应的查找替换。

方案一:

利用grep和shell中的变量替换

egrep -n "^aa" test.txt|while read line;do str2=${line%%&*};str3=${str2##*aa=};echo $str3|tr a-z A-Z;done;

返回结果:

A***ALUE

AA2VALUE

AA3VALUE

再次查找并执行替换命令略。。。。



注意,这里的关键部分就是${line%%&*}这一块,它的意思是"从每行的结尾开始匹配,找每行的最后一个&,然后返回剩余部分"。

说明一下,变量的扩展匹配一共有6种,由于后两种没有用到,这里仅提供4种,分别是:



1> ${variable#pattern}

如果pattern匹配variable的开始部分,从variable的开始处删除字符直到第一个匹配的位置,包括匹配部分,返回剩余部分。

2> ${variable##pattern}

如果pattern匹配variable的开始部分,从variable的开始处删除字符直到最后一个匹配的位置,包括匹配部分,返回剩余部分。

3> ${variable%pattern}

如果pattern匹配variable的结尾部分,从variable的结尾处删除字符直到第一个匹配的位置,包括匹配部分,返回剩余部分。

4> ${variable%%pattern}

如果pattern匹配variable的结尾部分,从variable的结尾处删除字符直到最后一个匹配的位置,包括匹配部分,返回剩余部分。

如果我把匹配模式变成${line%&*},即:

egrep -n "^aa" test|while read line;do str2=${line%&*};echo $str2|tr [a-z] [A-Z];done;

则,结果变为:

1:aa=aavalue&

2:aa=aa2value&

3:aa=aa3value&

这就类似于正则表达式中的惰性模式和贪心模式。

那么如果我希望匹配bb=yyyyy中的yyyyyy,则需要用到${line#&*}或${line##&*}了。

方案二:

利用awk和sed

sed -n 's/aa=\(.\+\)&&.*/\1/p' test.txt|awk '{print toupper($1);}';

结果输出:

A***ALUE

AA2VALUE

AA3VALUE

再次进行查找替换方式,略。。。

终极方法:

原来sed 里有个\U表示大小写转换的匹配关系

sed -n 's/aa=\(.\+\)&&.*/\U\1/p' test.txt
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: