shell字符串操作之插入、删除子串

发布时间:2019-09-07编辑:脚本学堂
本文介绍下,shell编程中,插入与删除子串,以及子串比较、子串排序、子串的编码转换等方法。有需要的朋友参考下。

1,插入子串
插入子串:就是在指定的位置插入子串,这个位置可能是某个子串的位置,也可能是从某个文件开头算起的某个长度。

公式:插入子串=把"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怎么用来插入字符吧,因为它的标签功能很有趣
$ echo $var | sed -e 's/( )/_1/' #(和)将不匹配到的字符串存放为一个标签,按匹配顺序为1,2...
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 me
// sed还有专门的插入指令,a和i,分别表示在匹配的行后和行前插入指定字符
$ echo $var | sed '/get/a test'
get the length of me
test
$ echo $var | sed '/get/i test'
test
get the length of me

2.5. 删除子串

删除子串:应该很简单了吧,把子串替换成“空”(什么都没有)不就变成了删除么。还是来简单复习一下替换吧。

例子:把var字符串中所有的空格给删除掉。
 

复制代码 代码示例:
// 再用{}
$ echo ${var// /}
getthelengthofme
// 再用linuxjishu/13830.html target=_blank class=infotextkey>awk
$ echo $var | awk '{gsub(" ","",$0); printf("%sn", $0);}'
// 再用sed
$ echo $var | sed 's/ //g'
getthelengthofme
// 还有更简单的tr命令,tr也可以把" "给删除掉,看
$ echo $var | tr -d " "
getthelengthofme

如果要删除掉第一个空格后面所有的字符串该怎么办呢?还记得{}的#和%用法么?
实际上删除子串和取子串未尝 不是两种互补的运算呢,删除掉某些不想要的子串,也就同时取得另外那些想要的子串——这个世界就是一个“二元”的世界,非常有趣)

2.6. 子串比较

这个很简单:还记得test命令的用法么?man test。它可以用来判断两个字符串是否相等的。另外,你发现了“字符串是否相等”和“字符串能否跟另外一个字符串匹配"两个问题之间的关系吗?如果两个 字符串完全匹配,那么这两个字符串就相等了。所以呢,上面用到的字符串匹配方法,也同样可以用到这里。

2.7. 子串排序

差点忘记这个重要的内容了,子串排序可是经常用到的,常见的有按字母序、数字序等正序或反序排列。
sort命令可以用来做这个工作,它和其他行处理 命令一样,是按行操作的。
有关sort命令的用法,可参考:
shell中sort、uniq、cut、paste和split用法详解
linux sort排序命令的高级用法(按多个列值进行排列)

另外,它类似cut和awk,可以指定分割符,并指定需要排序的列。
 

复制代码 代码示例:
$ var="get the length of me"
$ echo $var | tr ' ' 'n' | sort   #正序排
get
length
me
of
the
$ echo $var | tr ' ' 'n' | sort -r #反序排
the
of
me
length
get
 

2.7. 子串进制转换
如果字母和数字字符用来计数,那么就存在进制转换的问题。
 

复制代码 代码示例:
$ echo "ibase=10;obase=16;10" | bc
A
 

说明:ibase指定输入进制,obase指出输出进制,这样通过调整ibase和obase,你想怎么转就怎么转啦!

2.7. 子串编码转换

字符编码通常是指把一序列”可打印“字符转换成二进制表示,而字符解码呢则是执行相反的过程,如果这两个过程不匹配,则出现了所谓的”乱码“。

编码转换。
在linux下,可以使用iconv这个工具来进行相关操作。
在windows下常用的汉字编码是gb2312,而在linux下则大多采用utf8。
 

复制代码 代码示例:
$ nihao_gb2312=$(echo "你好" | iconv -f utf8 -t gb2312)
$ echo $nihao_gb2312
? ? ? ?
$ nihao_utf8=$(echo $nihao_gb2312 | iconv -f gb2312 -t utf8)
$ PS1="$ "
$ echo $nihao_utf8
你好

说明:当前终端默认编码是utf8。