当前位置:K88软件开发文章中心网站服务器框架Shell → 文章内容

Shell 字符串操作

减小字体 增大字体 作者:佚名  来源:网上搜集  发布时间:2019-1-23 14:39:35

tch还可以匹配正则表达式$ echo $var | awk '{printf("%d\n", match($0,"the"));}'5范例:查询子串,返回包含子串的行awk,sed 都可以实现这些功能,但是 grep 最擅长$ grep "consists of" test.txt # 查询文件包含consists of的行,并打印这些行$ grep "consists[[:space:]]of" -n -H test.txt # 打印文件名,子串所在行的行号和该行的内容$ grep "consists[[:space:]]of" -n -o test.txt # 仅仅打印行号和匹配到的子串本身的内容$ awk '/consists of/{ printf("%s:%d:%s\n",FILENAME, FNR, $0)}' text #看到没?和grep的结果一样$ sed -n -e '/consists of/=;/consists of/p' text #同样可以打印行号说明:awk,grep,sed 都能通过模式匹配查找指定字符串,但它们各有所长,将在后续章节中继续使用和比较它们,进而发现各自优点在这里姑且把文件内容当成了一个大的字符串,在后面章节中将专门介绍文件操作,所以对文件内容中存放字符串的操作将会有更深入的分析和介绍子串替换子串替换就是把某个指定的子串替换成其他的字符串,这里蕴含了“插入子串”和“删除子串”的操作。例如,想插入某个字符串到某个子串之前,就可以把原来的子串替换成”子串+新的字符串“,如果想删除某个子串,就把子串替换成空串。不过有些工具提供了一些专门的用法来做插入子串和删除子串的操作,所以呆伙还会专门介绍。另外,要想替换掉某个子串,一般都是先找到子串(查询子串),然后再把它替换掉,实质上很多工具在使用和设计上都体现了这么一点。范例:把变量 var 中的空格替换成下划线用 {} 运算符,还记得么?网中人的教程$ var="get the length of me"$ echo ${var/ /_} #把第一个空格替换成下划线get_the length of me$ echo ${var// /_} #把所有空格都替换成下划线get_the_length_of_me用 awk,awk 提供了转换的最小替换函数 sub 和全局替换函数 gsub,类似 / 和 //$ echo $var | awk '{sub(" ", "_", $0); printf("%s\n", $0);}'get_the length of me$ echo $var | awk '{gsub(" ", "_", $0); printf("%s\n", $0);}'get_the_length_of_me用 sed,子串替换可是 sed 的特长:$ echo $var | sed -e 's/ /_/' #s <= substitudeget_the length of me$ echo $var | sed -e 's/ /_/g' #看到没有,简短两个命令就实现了最小匹配和最大匹配g <= globalget_the_length_of_me有忘记 tr 命令么?可以用替换单个字符的:$ echo $var | tr " " "_"get_the_length_of_me$ echo $var | tr '[a-z]' '[A-Z]' #这个可有意思了,把所有小写字母都替换为大写字母GET THE LENGTH OF ME说明: sed 还有很有趣的标签用法呢,下面再介绍吧。有一种比较有意思的字符串替换是:整个文件行的倒置,这个可以通过 tac 命令实现,它会把文件中所有的行全部倒转过来。在某种意义上来说,排序实际上也是一个字符串替换。插入子串在指定位置插入子串,这个位置可能是某个子串的位置,也可能是从某个文件开头算起的某个长度。通过上面的练习,我们发现这两者之间实际上是类似的。公式:插入子串=把"old子串"替换成"old子串+new子串"或者"new子串+old子串"范例:在 var 字符串的空格之前或之后插入一个下划线用{}:$ var="get the length of me"$ echo ${var/ /_ } #在指定字符串之前插入一个字符串get_ the length of me$ echo ${var// /_ }get_ the_ length_ of_ me$ echo ${var/ / _} #在指定字符串之后插入一个字符串get _the length of me$ echo ${var// / _}get _the _length _of _me其他的还用演示么?这里主要介绍sed怎么用来插入字符吧,因为它的标签功能很有趣说明:( 和 ) 将不匹配到的字符串存放为一个标签,按匹配顺序为\1,\2...$ echo $var | sed -e 's/\( \)/_\1/'get_ the length of me$ echo $var | sed -e 's/\( \)/_\1/g'get_ the_ length_ of_ me$ echo $var | sed -e 's/\( \)/\1_/'get _the length of me$ echo $var | sed -e 's/\( \)/\1_/g'get _the _length _of _me看看 sed 的标签的顺序是不是 \1,\2...,看到没?\2 和 \1 调换位置后,the 和 get 的位置掉换了:$ echo $var | sed -e 's/\([a-z]*\) \([a-z]*\) /\2 \1 /g'the get of length mesed 还有专门的插入指令,a 和 i,分别表示在匹配的行后和行前插入指定字符$ echo $var | sed '/get/a test'get the length of metest$ echo $var | sed '/get/i test'testget the length of me删除子串删除子串:应该很简单了吧,把子串替换成“空”(什么都没有)不就变成了删除么。还是来简单复习一下替换吧。范例:把 var 字符串中所有的空格给删除掉。鼓励:这样一替换不知道变成什么单词啦,谁认得呢?但是中文却是连在一起的,所以中文有多难,你想到了么?原来你也是个语言天才,而英语并不可怕,你有学会它的天赋,只要有这个打算。再用 {}$ echo ${var// /}getthelengthofme再用 awk$ echo $var | awk '{gsub(" ","",$0); printf("%s\n", $0);}'再用 sed$ echo $var | sed 's/ //g'getthelengthofme还有更简单的 tr 命令,tr 也可以把空格给删除掉,看$ echo $var | tr -d " "getthelengthofme如果要删除第一个空格后面所有的字符串该怎么办呢?还记得 {} 的 # 和 % 用法么?如果不记得,回到这节的开头开始复习吧。(实际上删除子串和取子串未尝不是两种互补的运算呢,删除掉某些不想要的子串,也就同时取得另外那些想要的子串——这个世界就是一个“二元”的世界,非常有趣)子串比较这个很简单:还记得 test 命令的用法么? man test 。它可以用来判断两个字符串是否相等。另外,有发现“字符串是否相等”和“字符串能否跟另外一个字符串匹配 " 两个问题之间的关系吗?如果两个字符串完全匹配,那么这两个字符串就相等了。所以呢,上面用到的字符串匹配方法,也同样可以用到这里。子串排序差点忘记这个重要内容了,子串排序可是经常用到,常见的有按字母序、数字序等正序或反序排列。 sort 命令可以用来做这个工作,它和其他行处理命令一样,是按行操作的,另外,它类似 cut 和 awk,可以指定分割符,并指定需要排序的列。$ var="get the length of me"$ echo $var | tr ' ' '\n' | sort #正序排getlengthmeofthe$ echo $var | tr ' ' '\n' | sort -r #反序排theofmelengthget$ cat > data.txt1 2 3

上一页  [1] [2] [3] [4] [5]  下一页


Shell 字符串操作