复习
扩展
打印某行到某行之间的内容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]#
```原文:http://ch71smas.blog.51cto.com/13090095/1963549