当前位置: 技术问答>linux和unix
100分请教高手sed 表达式
来源: 互联网 发布时间:2016-12-08
本文导语: http://www.cublog.cn/u/21948/showart_413005.html [armlinux@lqm bash]$ cat test1 uid=500(guest) gid=500(others) groups=500(users),11(floppy) 下面把小括号内的值单独取出,如果利用贪婪规则,解决方案如下: 1 sed -e 's/[^(]*(([^)]*)....
http://www.cublog.cn/u/21948/showart_413005.html
1 sed -e 's/[^(]*(([^)]*).*/1/' test1
这一句中的[^(]是什么意思?
整句怎么分析?
[armlinux@lqm bash]$ cat test1
uid=500(guest) gid=500(others) groups=500(users),11(floppy)
下面把小括号内的值单独取出,如果利用贪婪规则,解决方案如下:
1 sed -e 's/[^(]*(([^)]*).*/1/' test1
2 sed -e 's/[^(]*(([^)]*)[^(]*(([^)]*).*/2/' test1
3 sed -e 's/[^(]*(([^)]*)[^(]*(([^)]*)[^(]*(([^)]*).*/3/' test1
4 sed -e 's/.*((.*))/1/' test1
1 sed -e 's/[^(]*(([^)]*).*/1/' test1
这一句中的[^(]是什么意思?
整句怎么分析?
|
sed -e 's/[^(]*(([^)]*).*/1/' test1
主要是sed的替换命令,语法如下:
[address]s/pattern/replacement/flags
本问题的pattern是:[^(]*(([^)]*).*
[ ] 匹配方括号所包括的字符中的任何一个
( ) 把( 和 ) 之间的模式保存到专门的存储空间,然后可以用1,2 …… (即 n 来引用,n最大为9)
首先匹配0个或多个不是(的字符,直到(字符,然后将(字符后面的0个或多个不是)的字符的内容存储到1中
最后就是简单的替换命令了,用1替换uid=500(guest),即guest替换uid=500(guest)
主要是sed的替换命令,语法如下:
[address]s/pattern/replacement/flags
本问题的pattern是:[^(]*(([^)]*).*
[ ] 匹配方括号所包括的字符中的任何一个
( ) 把( 和 ) 之间的模式保存到专门的存储空间,然后可以用1,2 …… (即 n 来引用,n最大为9)
首先匹配0个或多个不是(的字符,直到(字符,然后将(字符后面的0个或多个不是)的字符的内容存储到1中
最后就是简单的替换命令了,用1替换uid=500(guest),即guest替换uid=500(guest)
|
[ ] 匹配方括号所包括的字符中的任何一个,例如,[AB]匹配A或B
插入符^作为方括号内的第一个字符,^使上述的含义反过来,即[^AB]匹配任何不是A和B的字符
插入符^作为方括号内的第一个字符,^使上述的含义反过来,即[^AB]匹配任何不是A和B的字符
|
太复杂了,帮你顶
|
纠正一下
.* 表示匹配任意数量的任何字符(除了换行符)
最后就是简单的替换命令了,用1替换上面个句子,即guest替换uid=500(guest) gid=500(others) groups=500(users),11(floppy)
1 sed -e 's/[^(]*(([^)]*).*/1/' test1
2 sed -e 's/[^(]*(([^)]*)[^(]*(([^)]*).*/2/' test1
3 sed -e 's/[^(]*(([^)]*)[^(]*(([^)]*)[^(]*(([^)]*).*/3/' test1
上述三个原理相同,区别只是分别捕获和存储不同的内容,即 1 2 3
4 sed -e 's/.*((.*))/1/' test1
最后一个使用贪婪的方法捕获floppy
.* 表示匹配任意数量的任何字符(除了换行符)
最后就是简单的替换命令了,用1替换上面个句子,即guest替换uid=500(guest) gid=500(others) groups=500(users),11(floppy)
1 sed -e 's/[^(]*(([^)]*).*/1/' test1
2 sed -e 's/[^(]*(([^)]*)[^(]*(([^)]*).*/2/' test1
3 sed -e 's/[^(]*(([^)]*)[^(]*(([^)]*)[^(]*(([^)]*).*/3/' test1
上述三个原理相同,区别只是分别捕获和存储不同的内容,即 1 2 3
4 sed -e 's/.*((.*))/1/' test1
最后一个使用贪婪的方法捕获floppy
|
sed不支持非贪婪
|
用sed 完成这个任务感觉有点勉为其难啊
用awk轻松搞定
awk -F[()] '{print $2}' test1
awk -F[()] '{print $4}' test1
awk -F[()] '{print $6}' test1
awk -F[()] '{print $8}' test1
用awk轻松搞定
awk -F[()] '{print $2}' test1
awk -F[()] '{print $4}' test1
awk -F[()] '{print $6}' test1
awk -F[()] '{print $8}' test1
|
1 sed -e 's/[^(]*(([^)]*).*/1/' test1
[^(]字符不包涵(的
[^(]字符不包涵(的