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