Linux三剑客之sed(二)

1.sed替换命令

        1.sed替换语法

        sed '地址范围 | 模式范围 s/需替换字符串/替换字符串/选项'  file

        主要起到执行替换的命令是s,原始文件依然不会被修改,如需修改原始文件配合使用w。

        2.实例:

        1.用Director替换所有行中的Manager:

# sed 's/Manager/Director/' employee.txt
101,John Doe,CEO
102,Jason Smith,IT Director
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
105,Jane Miller,Sales Director

        2.只把包含Sales的行中的Manager替换为Director:

# sed '/Sales/s/Manager/Director/' employee.txt
101,John Doe,CEO
102,Jason Smith,IT Manager
103,Raj Reddy,Sysadmin
104,Anand Ram,Developer
105,Jane Miller,Sales Director

2.全局g 

        默认情况下,sed只会替换每行中第一次出现的字符串。如果想替换每行所有的匹配的字符串,就需要g。

        把所有小写a替换为大写字母A :

# sed 's/a/A/g' employee.txt
101,John Doe,CEO
102,JAson Smith,IT MAnAger
103,RAj Reddy,SysAdmin
104,AnAnd RAm,Developer
105,JAne Miller,SAles MAnAger

 3.数字标志       

        使用数字标志可以指定匹配的字符串出现的次序。只有第n此出现才会触发替换。每行的数字从1开始,到512结束。

        把第二次出现的a替换为大写A:

# sed 's/a/A/2' employee.txt
101,John Doe,CEO
102,Jason Smith,IT MAnager
103,Raj Reddy,SysAdmin
104,Anand RAm,Developer
105,Jane Miller,SAles Manager

4.打印标志p

        当完成替换操作后,打印替换的行。

        只打印替换后的行:

# sed -n 's/John/Johnny/p' employee.txt
101,Johnny Doe,CEO

 5.写标志w

        和之前使用的命令 p 一样,使用 w 会把替换后的内容保存到文件 output.txt 中。

        把每行第二次出现的locate替换为find,把替换的结果保存到文件中,同时显示输入文件所有内容:

# sed 's/locate/find/2w www.txt' located.txt

6.忽略大小写标志i 

        把John或john替换为Johnny:

# sed 's/john/Johnny/i' employee.txt

 7.执行命令e     

        该标志可以将模式空间中的任何内容当作shell命令执行,并将结果返回到模式空间。

        在file.txt文件中的每一行前面添加ls -l并打印结果:

# sed 's/^/ls -l/e' file.txt
-rw-r--r-- 1 root root 1533 Dec 13 20:21 /etc/passwd
-rw-r--r-- 1 root root 682 Dec 13 20:21 /etc/group

8.替换标志组合

        我们可以根据需要把多个标志组合起来使用:

# sed -n 's/manager/Director/igwp output.txt' employee.txt

9.sed替换命令分解符 

        如果要替换的字符中带有分割符/,那么就需要使用反斜杠\来转义:

        限制使用sed把path.txt中/usr/local/bin替换为/usr/bin:

# sed 's/\/usr\/local\/bin/\/usr\/bin/' path.txt

        当然,这种格式明显很难看,所以sed命令的分解符还有|、^、@或!

sed 's|/usr/local/bin|/usr/bin|' path.txt
sed 's^/usr/local/bin^/usr/bin^' path.txt
sed 's@/usr/local/bin@/usr/bin@' path.txt
sed 's!/usr/local/bin!/usr/bin!' path.txt

10.单行内容执行多个命令

        sed执行命令的过程是读取内容、执行命令、打印结果、重复循环。执行命令部分,可以由多个命令执行,sed将会一个一个一次执行。

        模式空间内执行两个替换命令:

# sed '{
>s/Developer/IT Manager/
>s/Manager/Director/
>}' employee.txt

11.&——获取匹配到的模式

        给雇员id加上[ ],即101改成[101]:

# sed 's/^[0-9][0-9][0-9]/[&]/g' employee.txt
[101],John Doe,CEO
[102],Jason Smith,IT Manager
[103],Raj Reddy,Sysadmin
[104],Anand Ram,Developer
[105],Jane Miller,Sales Manager

12.单个分组和格式化数字

单个分组:

# sed 's/\([^,]*\).*/\1/g' employee.txt
101
102
103
104
105

格式化:

# cat number.txt
1
12
123
1234
12345
123456

# sed 's/\(^\|[^0-9.]\)\([0-9]\+\)\([0-9]\{3\}\)/\1\2,\3/g' number.txt
1
12
123
1,234
12,345
123,456


13.sed中正则表达式

把employee.txt中每行最后两个字符替换为“,Not Defined” :

# sed -n 's/..$/,Not Defined/p' employee.txt
101,John Doe,C,Not Defined
102,Jason Smith,IT Manag,Not Defined
103,Raj Reddy,Sysadm,Not Defined
104,Anand Ram,Develop,Not Defined
105,Jane Miller,Sales Manag,Not Defined

sed中正则表达式与我们一般用的正则表达式匹配方式差不多。      

14.单行执行多个sed命令

        1.使用多命令选项-e(前面已经提到过)

        2.使用\折行执行多个命令

# sed -n -e '/^root/ p'\
-e '/^nobody/ p'\
-e '/^mail/ p'\
/etc/passwd

        3.使用{}把多个命令组合

# sed -n '{
/^root/ p
/^nobody/ p
/^mail/ p
}' /etc/passwd

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值