复习 
扩展

打印某行到某行之间的内容http://ask.apelearn.com/question/559

sed转换大小写 http://ask.apelearn.com/question/7758

sed在某一行最后添加一个数字http://ask.apelearn.com/question/288

删除某行到最后一行 http://ask.apelearn.com/question/213

打印1到100行含某个字符串的行 http://ask.apelearn.com/question/1048



# 六周第四次课(9月7日)
复习 、  扩展



# 打印某行到某行之间的内容  http://ask.apelearn.com/question/559
- 打印文件中特定的某行到某行之间的内容

sed
例如:有个文件test的内容如下:
```
ert
fff
**
[abcfd]
123
324
444
[rty]
**
fgfgf 
```

怎么能截取
```
[abcfd]
123
324
444
[rty]
```

这一部分出来呢?
1.先要在test文件里有这些内容 用vim 打开test文件,把这些内容放进去
```
[root@aminglinux-001 sed]# vim test
[root@aminglinux-001 sed]# cat test
ert
fff
**
[abcfd]
123
324
444
[rty]
**
fgfgf 
[root@aminglinux-001 sed]# 
```
2.现在要把[abcfd]到[rty] 这中间的段位截取出来并且打印到屏幕上

答案: sed -n '/\[abcfd\]/,/\[rty\]/p' test
```
[root@aminglinux-001 sed]# sed -n '/\[abcfd\]/,/\[rty\]/'p test
[abcfd]
123
324
444
[rty]
[root@aminglinux-001 sed]# 
```



#  sed转换大小写 http://ask.apelearn.com/question/7758
- sed 如何转换大小写字母

- sed中,使用\u表示大写,\l表示小写

1. 把每个单词的第一个小写字母变大写:
sed 's/\b[a-z]/\u&/g' filename

2. 把所有小写变大写:
sed 's/[a-z]/\u&/g' filename

3. 大写变小写:
sed 's/[A-Z]/\l&/g' filename

-实验用test文件来做实验
1.把每个单词的第一个小写字母变大写 

-命令解释 :\b边界,放在开头就代表开头  放在结尾就代表结尾 ,在替换字符串中,&代表搜索字符串[RE]所匹配的字符串的值,
-sed中,使用\u表示大写,\l表示小写
```
[root@aminglinux-001 sed]# cat test
ert
fff
**
[abcfd]
123
324
444
[rty]
**
fgfgf 
[root@aminglinux-001 sed]# sed 's/\b[a-z]/\u&/g' test
Ert
Fff
**
[Abcfd]
123
324
444
[Rty]
**
Fgfgf 
[root@aminglinux-001 sed]# 
```

2. 把所有小写变大写:
sed 's/[a-z]/\u&/g' test
-命令解释:[a-z]代表所有字母,\u代表大写 
```
[root@aminglinux-001 sed]# sed 's/[a-z]/\u&/g' test
ERT
FFF
**
[ABCFD]
123
324
444
[RTY]
**
FGFGF 
[root@aminglinux-001 sed]# 
```

3. 大写变小写:
sed 's/[A-Z]/\l&/g' test
-命令解释:[A-Z]代表所有大写字母 \l 代表小写
```
[root@aminglinux-001 sed]# sed 's/[A-Z]/\l&/g' test
ert
fff
**
[abcfd]
123
324
444
[rty]
**
fgfgf 
[root@aminglinux-001 sed]# 
```


#  sed在某一行最后添加一个数字 http://ask.apelearn.com/question/288

- sed在文件中某一行最后添加一个数字

```
sed 's/\(^a.*\)/\1 12/' test

#cat  test
askdj
aslkd aslkdjf3e
skdjfsdfj
sdkfjk
fsdkfjksdjfkjsdf
12sdfesdf
aslkdjfkasdjf asdlfkjaskdfj

#sed 's/\(^a.*\)/\1 12/' test

askdj 12
aslkd aslkdjf3e  12
skdjfsdfj
sdkfjk
fsdkfjksdjfkjsdf
12sdfesdf
aslkdjfkasdjf asdlfkjaskdfj  12

```

-实验vim test1 把上面文本内容放进test1里面
```
[root@aminglinux-001 sed]# vim test1
[root@aminglinux-001 sed]# cat test1
askdj
aslkd aslkdjf3e
skdjfsdfj
sdkfjk
fsdkfjksdjfkjsdf
12sdfesdf
aslkdjfkasdjf asdlfkjaskdfj
[root@aminglinux-001 sed]# 
```

-在以a字母开头的行添加一个数字12
-命令解释:(^a.*)以a字母开头的行    \1 12  ,\1表示前面的 (^a.*) ,\1 12表示在 (^a.*)里面内容里后面加上12 
```
[root@aminglinux-001 sed]# sed 's/\(^a.*\)/\1 12/' test1
askdj 12
aslkd aslkdjf3e 12
skdjfsdfj
sdkfjk
fsdkfjksdjfkjsdf
12sdfesdf
aslkdjfkasdjf asdlfkjaskdfj 12
[root@aminglinux-001 sed]# 
```







# 删除某行到最后一行 http://ask.apelearn.com/question/213
- sed删除某关键字的下一行到最后一行

[root@test200 ~]# cat test
a
b
c
d
e
f
[root@test200 ~]# sed '/c/{p;:a;N;$!ba;d}' test
a
b
c

- 解释:定义一个标签a,匹配c,然后N把下一行加到模式空间里,匹配最后一行时,才退出标签循环,然后命令d,把这个模式空间里的内容全部清除。

if 匹配"c"
:a
追加下一行
if 不匹配"$"
goto a
最后退出循环,d命令删除。

- 实验:把之前的test文件内容改变成上面内容一样

```
[root@aminglinux-001 sed]# vim test
[root@aminglinux-001 sed]# cat test
a
b
c
d
e
f 
[root@aminglinux-001 sed]# 
```
- 删除某关键字的下一行到最后一行
```
[root@aminglinux-001 sed]# sed '/c/{p;:a;N;$!ba;d}' test
a
b
c
[root@aminglinux-001 sed]# 
```

-也可以用这个命令sed -r '/d/,$d' test
-命令解释:sed -r '/关键词/,$d' test
```
[root@aminglinux-001 sed]# sed -r '/d/,$d' test
a
b
c
[root@aminglinux-001 sed]# 

```
- sed -r '/关键词/,$d' test  这里的关键词 打印出来的是关键词上面的
```
[root@aminglinux-001 sed]# sed -r '/a/,$d' test
[root@aminglinux-001 sed]# sed -r '/b/,$d' test
a
[root@aminglinux-001 sed]# sed -r '/c/,$d' test
a
b
[root@aminglinux-001 sed]# sed -r '/d/,$d' test
a
b
c
[root@aminglinux-001 sed]# sed -r '/e/,$d' test
a
b
c
d
[root@aminglinux-001 sed]# sed -r '/f/,$d' test
a
b
c
d
e
```
-命令解释:sed -r '/关键词/,$d' test  全部打印出来,最后一个是f, f后面试最后一个 以#代表
```
[root@aminglinux-001 sed]# sed -r '/#/,$d' test
a
b
c
d
e
f 
[root@aminglinux-001 sed]# 
```







# 打印1到100行含某个字符串的行 http://ask.apelearn.com/question/1048

- 如何使用sed打印1到100行包含某个字符串的行

- 这个需求,其实就是sed指定行范围匹配,较少见。实现:sed  -n '1,100{/abc/p}'  1.txt

- 这个命令也好像可以实现 sed -n '1,100p' 1.txt|sed -n '/abc/'p
- 命令解释:1到100行 包含“abc”的 给打印出来
- 打印1-6行 含有a字母的行
```
[root@aminglinux-001 sed]# cat test
a
b
c
d
e
f 

[root@aminglinux-001 sed]# sed -n '1,6{/a/p}' test
a
[root@aminglinux-001 sed]# 
```
- 再编辑下文件test,打印1到6行 中 包含字母a的 行
```
[root@aminglinux-001 sed]# cat test
a
b
c
da
ea
f 
[root@aminglinux-001 sed]# 
[root@aminglinux-001 sed]# sed -n '1,6{/a/p}' test
a
da
ea
[root@aminglinux-001 sed]# 
```