sed扩展

  1. 打印某行到某行之间的内容

  2. sed转换大小写

  3. sed在某一行最后添加一个数字

  4. 删除某行到最后一行

  5. 打印1到100行含某个字符串的行



练习题

假设一个文件test.txt里面包含如下内容:

ert

fff

[abcfd]

123

324

444

[rty]

fgfgf


问,如何截取出如下部分内容?

[abcfd]

123

324

444

[rty]


示例如下:

# sed -n '/\[abcfd\]/,/\[rty\]/p' test.txt

[abcfd]

123

324

444

[rty]



sed 如何转换大小写字母

解释:sed中,使用\u表示大写,\l表示小写


把每个单词的第一个小写字母变大写:

操作命令:sed 's/\b[a-z]/\u&/g' filename


把所有小写字母变大写字母:

操作命令:sed 's/[a-z]/\u&/g' filename


大写字母变小写字母:

操作命令:sed 's/[A-Z]/\l&/g' filename

示例如下:

# cat test.txt

erT

ffF

**

[abcfd]

123

324

444

[rty]

**

Fgfgf

DDF


# sed 's/\b[a-z]/\u&/g' test.txt        

ErT

FfF

**

[Abcfd]

123

324

444

[Rty]

**

Fgfgf

DDF


# sed 's/[a-z]/\u&/g' test.txt

ERT

FFF

**

[ABCFD]

123

324

444

[RTY]

**

FGFGF

DDF


# sed 's/[A-Z]/\l&/g' test.txt

ert

fff

**

[abcfd]

123

324

444

[rty]

**

fgfgf

ddf



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

操作命令:sed 's/(^a.*)/\1 12/' test

示例如下:

# cat test2.txt

skdj

aslkd aslkdjf3e

skdjfsdfj

sdkfjk

fsdkfjksdjfkjsdf

sdfesdf

aslkdjfkasdjf asdlfkjaskdfj


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

skdj

aslkd aslkdjf3e 12

skdjfsdfj

sdkfjk

fsdkfjksdjfkjsdf

sdfesdf

aslkdjfkasdjf asdlfkjaskdfj 12

# sed 's/\(^s.*\)/\1 12/' test2.txt

skdj 12

aslkd aslkdjf3e

skdjfsdfj 12

sdkfjk 12

fsdkfjksdjfkjsdf

sdfesdf 12

aslkdjfkasdjf asdlfkjaskdfj

# sed 's/\(^f.*\)/\1 12/' test2.txt

skdj

aslkd aslkdjf3e

skdjfsdfj

sdkfjk

fsdkfjksdjfkjsdf 12

sdfesdf

aslkdjfkasdjf asdlfkjaskdfj



sed删除某关键字的下一行到最后一行

示例如下:

# cat test3.txt

a

b

c

d

e

f

# sed '/c/{p;:a;N;$!ba;d}' test3.txt

a

b

c



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

其实就是sed指定行范围匹配,较少见。

示例如下:

# sed  -n '1,100{/use/p}'  test4.txt 

tss:x:59:59:Account used by the trousers package to sandbox the tcsd daemon:/dev/null:/sbin/nologin

user1:x:1001:1001::/home/user1:/bin/bash

user2:x:1003:1003::/home/user2:/bin/bash

user3:x:1004:1005::/home/user3:/bin/bash

user4:x:1006:1005::/home/aming111:/sbin/nologin

user5:x:1007:1007::/home/user5:/bin/bash

user6:x:1008:1010::/home/user6:/bin/bash