echo 123456789 | sed -n 's/\(.*\)\(.\)/\1/g'

这种方法意思是sed分组匹配。怎么分组呢?先看单引号里的内容。

-n意思是只显示sed处理的行。如果后面跟的是文件,则不会直接修改源文件。会单独加一行匹配到的行。然后单独输出加出来的这一行。

s///g 这是固定语法。匹配替换字符串用的。s/后面这堆乱七八糟的是什么意思呢?慢慢看

先看这个:\(.*\)\(.\)/

刚才说用法是分组匹配,分组关键字是用括号分组。

先看第一个分组(.*)。但是括号需要转义,所以就变成了\(.*\) 这是第一个分组。里面的内容是.*,即正则表达式中的点和星号,意为任意长度任意字符串。也就是说如果我有1个字符串用这个正则能匹配到,有100万1000万个字符也能匹配到。没有也能匹配到哦。因为是任意长度。

第二个分组(.),同样的,先把括号转义。变成了\(.\)。里面的内容同样是正则表达式中的点。意思是任意一个字符串,注意第二个分组和第一个分组所用的正则的区别。

这样,我们就把123456789这个字符串分割成了两组。

第一组是:12345678

第二组是:9

接下来再看这个:/\1/g

第一个斜线是s///g里面中间的斜线,属于固定语法。\1的意思是第一个分组。也就是说这里的\1就等于12345678,为什么1前面要加上反斜线呢。如果不加这个反斜线,就会把匹配到的内容替换成了数字1,所以要加上反斜线转义,告诉sed,我要输出第一个分组。

g是全局匹配。

组合起来看就简单了,我先出输出了123456789,然后用sed分组匹配。分两组,第一组是12345678,第二组是9,然后输出第一个分组。就能实现你说的如何去掉每行最后一个字符。

由于sed处理文件的机制属于从第一行开始读,然后读第二行,第三行...以此类推。

所以这样就能把每行的最后一个字符去掉。

Logo

更多推荐