20130603:
BRE(grep\sed)和ERE(egrep\awk)的使用的区别
1、^和$不在行首或行尾时为字面意思
BRE:grep 'a^c' file
ERE:grep -E  'a\^c' file
2、匹配出现的次数
BRE:grep 'ab\{2,4\}c' file
ERE:grep -E 'ab{2,4}c' 1
3、ERE有? +
4、
[root@localhost ~]# cat 1
abc
acc
adc
[root@localhost ~]# grep 'a\(b\|c\)c' 1
abc
acc
[root@localhost ~]# grep -E 'a(b|c)c' 1
abc
acc
补充:2013-06-05
1、例:同时使用插入和追加命令
[root@localhost ~]# cat 1
a
b
c
a
b
c
[root@localhost ~]# sed '/^a/i\
1\
11;
/^b/a\
2\
22' 1
1
11;
a
b
2
22
c
1
11;
a
b
2
22
c
2、列表"l"小写L,列出不可打印的字符,如换行符。
sed -n 'l' m1.txt
sed -i 's/\r$//gp' m1.txt替换换行符^M$为$
3、打印行号(内容)
[root@localhost upload]# cat 1
a
b
c
a
b
c
a
b
c
[root@localhost upload]# sed -n '/a/{=;p}' 1
1
a
4
a
7
a
[root@localhost upload]# sed -n '/a/{
=
p}' 1
1
a
4
a
7
a
[root@localhost upload]# sed -n '/a/=' 1
1
4
7
4、命令n(next)匹配模式,读入模式的下一行,对读入的这一行,执行后续的操作
[root@localhost upload]# cat 1
a
b
c
[root@localhost upload]# sed  '/a/{n;d}' 1
a
c
[root@localhost upload]# sed  '/a/{n;s/^$/Z/}' 1
a
Z
b
c
5、读(r)和写(w)命令:注意命令后只能有一个空格!文件结尾也不可加空格!
    5.1读:替换一行为多行,如果要替换的内容很多时,很有用
[root@localhost upload]# cat 1
a
b
c
a
b
c
[root@localhost upload]# cat 2
1
2
3
[root@localhost upload]# sed '/b/{
r 2
d}' 1
a
1
2
3
c
a
1
2
3
c
如果像上面这样替换的内容比较少的话可以直接使用c更改命令操作:
[root@localhost upload]# sed '/b/{
c1\
> 2\
> 3
> }' 1
a
1
2
3
c
a
1
2
3
c
    5.2写命令:把模式空间中匹配的行写入文件,例:分组销售人员名单
[root@localhost upload]# cat 1
aaa jinan
bbb qingdao
ccc jinan
ddd qingdao
eee jining
[root@localhost upload]# cat 1.sed
/jinan/{
s///
w jinan.txt
}
/qingdao/{
s///
w qingdao.txt
}
/jining/{
s///
w jining.txt
}
[root@localhost upload]# sed -nf 1.sed 1
[root@localhost upload]# ll
total 40
-rwxrwxrwx 1 root root 55 Jun  5 10:56 1
-rw-r--r-- 1 root root 90 Jun  5 11:02 1.sed
-rw-r--r-- 1 root root 10 Jun  5 11:05 jinan.txt
-rw-r--r-- 1 root root  5 Jun  5 11:05 jining.txt
-rw-r--r-- 1 root root 10 Jun  5 11:05 qingdao.txt
[root@localhost upload]# cat jinan.txt
aaa
ccc
[root@localhost upload]# cat jining.txt
eee
[root@localhost upload]# cat qingdao.txt
bbb
ddd
6、多行模式空间:命令“N”(Next)不同于next
处理完N加入进来的两行,读取新行。即使N处理的指定行还有模式可以匹配。
[root@localhost upload]# cat 1
11111111111 ab bc cd 1x
22222 ab
3333333 ab
bc cd 44444
5555 ab bc
cd ab bc cd 666 ab
bc cd 77
8 ab bc cd
[root@localhost upload]# cat 1.sed
s/ab bc cd/X Y Z/g
/ab/ {
N
/ab *\n* *bc *\n* *cd/ {
    s/ *\n/ /
    s/ab bc cd */X Y ZP\n/
    }
P
D
}
[root@localhost upload]# sed -f 1.sed 1
11111111111 X Y Z 1x
22222 ab
3333333 X Y ZP
44444
5555 X Y ZP
X Y Z 666 X Y ZP
77
8 X Y Z
注:之所以替换为ZP是为了理解哪些语句影响了哪些行。

------------------------------------------------------------------------------

补充:

sed替换时忽略前N个匹配的需要替换的字符

sed 's/a/A/5g' test.txt 从第5个a开始替换