shell脚本的字符串匹配

转载 2013年12月06日 10:18:28

今天遇到了这样的一个问题:
    在一个有几百行的模板文件中,我想找出具有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;

返回结果:
AAVALUE
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);}';
结果输出:
AAVALUE
AA2VALUE
AA3VALUE
再次进行查找替换方式,略。。。

终极方法:

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

   sed -n 's/aa=\(.\+\)&&.*/\U\1/p' test.txt

相关文章推荐

linux shell 字符串操作(长度,查找,替换,匹配)详解

在做shell批处理程序时候,经常会涉及到字符串相关操作。有很多命令语句,如:awk,sed都可以做字符串各种操作。 其实shell内置一系列操作符号,可以达到类似效果,大家知道,使用内部操作符会省略...
  • zzxian
  • zzxian
  • 2012-05-25 13:55
  • 17322

shell脚本里面通过正则匹配操作字符串的问题

a=$( expr 'helloworld20140501.txt' : '.*\([0-9]\{8\}\).*' ) echo $a linux shell 中可以将命令的结果赋值给变量,$(命令)...
  • yohoph
  • yohoph
  • 2015-03-04 17:44
  • 3853

Linux shell 之 提取文件名和目录名的一些方法

很多时候在使用Linux的shell时,我们都需要对文件名或目录名进行处理,通常的操作是由路径中提取出文件名,从路径中提取出目录名,提取文件后缀名等等。例如,从路径/dir1/dir2/file.tx...

shell中正则表达式的使用

使用方法一:#赋值给变量var read var #定义regex正则表达式 regex="[0-9]"if [[ $var =~ $regex]];then #match #do s...

shell判断一个字符串是否匹配某个模式

方法一 网上看到这两个方法,貌似有些问题 echo $line | grep -e "*repeat*" test $? -eq 0 && echo&...

Shell基于模式匹配的字符串操作

Shell基于模式匹配的字符串操作

shell 字符串匹配

问题:shell 如何判断某个文件名以某个字符开头~解决:#var="cn get the length of me"#$1: parameter 1 传要判断的文件名字var=$1isCN=fals...
  • gnuser
  • gnuser
  • 2009-01-06 14:30
  • 15599

shell 脚本查找、抽取指定字符串的方法

shell 脚本查找、抽取指定字符串的方法

windows批处理(shell)多行字符串匹配

实现从文件中截取出从一个字符串开始到另一个字符串结束,之间所有的字符输出到另一个文件中。下面的批处理脚本实现从1_DDL.out文件中将所有在CREATE和分号之间的行输出到0.txt中。(一个CRE...

linux强大的查询字符匹配命令和shell脚本

变量:本地变量:只对当前有效环境变量:对当前shell和子shell都有效  export A=3  A=3  export A 引用不需要加&export 查看环境变量[root@serve...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)