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
在一个有几百行的模板文件中,我想找出具有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
相关文章推荐
- Formatting Long Lines 格式化多行字符的shell脚本
- Linux系统命令及Shell脚本学习笔记五:字符处理
- shell脚本中一些特殊字符
- Shell脚本常识--(特殊字符)
- [置顶] shell脚本的特殊字符
- Shell脚本的基本语法(二) 预定义特殊字符、case语句和函数调用
- shell 脚本中字符的自增
- [Linux]:Bash Shell的字符串匹配方法
- shell脚本中28个特殊字符的作用简明总结
- shell 脚本之特殊变量字符
- shell 脚本 M-BM- 字符问题
- Shell脚本关于屏幕输出的字符进行颜色控制的问题
- 在shell脚本文件中控制输出字符的颜色
- ASP VBScript脚本多字符串匹配问题
- shell 脚本中获取变量时控制开始字符位置--使用冒号加数字
- shell脚本中字符和文件的判断及字符串入参的注意事项
- shell脚本控制字符
- Shell脚本实现查找字符串中某字符最后出现的位置
- shell 脚本中常用字符含义与vim编辑器中的快捷键
- shell脚本中28个特殊字符的作用简明总结