您的位置:首页 > 其它

sed的一些使用技巧

2014-11-24 12:10 295 查看
一、当一个文件里有两行相同的内容,但这时只想修改第一行的内容或者第二行的内容,而不是全部修改,以下例子说明下:

1、修改匹配到第一行为port的内容(若要真修改前面记得-i):

[root support-files]$ cat test.txt
[client]
port            = 3306
user            = mysql
socket          =/data/mysql
[mysqld]
port            = 3306
[root support-files]$ sed "1,/port/{s#=.*#=3307#}" test.txt |grep port
port            = 3307
port            = 3306


2.修改匹配到的第二行内容,而不是第二行的内容,同样以port=3306为例:

[root support-files]$ cat test.txt
[client]
port            = 3306
user            = mysql
socket          =/data/mysql
[mysqld]
port            = 3306
[root support-files]$ sed '/port/{x;s/^/./;/^.\{2\}$/{x;s/3306/3307/;b};x}' test.txt |grep port
port            = 3306
port            = 3307


可以看到已经修改了吧,嘻^.^

二、有时想MySQL里binlog后面的几个数字取出来,下面以mysql-bin.000036为例:

[root mysql-5.5]$ echo "mysql-bin.000036" |cut -d . -f2 |sed 's/^0\+//'
36
[root mysql-5.5]$ echo "mysql-bin.000036" |cut -d . -f2 |sed 's/^00*//g'
36
[root mysql-5.5]$ echo "mysql-bin.000036" |cut -d . -f2 |sed 's/0*//g'
36


嘿嘿,用awk也能实现:

[root mysql-5.5]$ echo "mysql-bin.000036" |cut -d . -f2 |awk '{print $0+0}'
36


三、有时有一串数字,你可能用取前三位数,有时想取后三位数,反正想取前N个数或后N个数,都可以,下面举个例子:

取前3个数字:

[root ~]$ echo "11438010633"|sed 's/.*\(...\)/\1/'
633


取后3个数字:

[root ~]$ echo "11438010633"|sed 's/\(...\).*$/\1/'
114


四、有时一行有几个相同的字符,但有时只想修改第2个或者第3个时,如例子:

下面是把第二个test修改为Linux

[root ~]$ cat aa.sh
i am test a test,test is good boy test
this is a test
[root ~]$ sed 's/test/Linux/2' aa.sh
i am test a Linux,test is good boy test
this is a test


第三个test修改掉为Linux的例子

[root ~]$ cat aa.sh
i am test a test,test is good boy test
this is a test
[root ~]$ sed 's/test/Linux/3' aa.sh
i am test a test,Linux is good boy test
this is a test


作者:陆炫志

出处:xuanzhi的博客 http://www.cnblogs.com/xuanzhi201111

您的支持是对博主最大的鼓励,感谢您的认真阅读。本文版权归作者所有,欢迎转载,但请保留该声明。

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: