标签:sed
sed [options] sed-commands input-file
options:
-n: 静默模式,不输出模式空间中的内容
-e script –e script: 指定多个脚本命令
-f script_file: 指定脚本文件
-i: 直接编辑原文件
-r: 使用扩展的正则表达式
sed-commands:
d: 删除
p: 打印
i \text: 在模式匹配行的前面插入
a \text: 在模式匹配行的后面追加
r /path/to/somefile: 在指定位置读取另外一个文件插入
w /path/to/somefile: 把符合条件的所有行保存至指定的文件中
=: 打印行号
s/查找条件/替换文本/: 查找替换
地址定界:
1,3: 匹配第一行到第三行
2,$: 匹配第二行到最后一行
/he/,$: 匹配he所在的行到最后一行
/he/,/yy/:匹配he所在的行到yy所在的行
/li/: 匹配所有li的行
sed查找替换命令格式:
sed ‘[address-range | pattern-range] s/original-string/replacement-string/[flags]‘ input-file
flags:
g: 替换一行中所有匹配的模式
[1|2|3|..n]: 规划换一行中第n次匹配的模式
p: 打印替换后的模式
w output.txt: 把替换后的文本写入文件output.txt
i: 忽略搜索的模式的大小写
sed的工作模式:
1.读取一行到模式空间(模式空间是一个sed命令的buffer空间)
2.在此模式空间中执行sed 命令
3.打印模式空间中的行
4.重复以上步骤
实例:
以employee.txt为input-file
# vim employee.txt 101,John Doe,CEO 102,Jason Smith,IT Manager 103,Raj Reddy,Sysadmin 104,Anand Ram,Developer 105,Jane Miller,Sales Manager
打印所有行
# sed -n ‘p‘ employee.txt 101,John Doe,CEO 102,Jason Smith,IT Manager 103,Raj Reddy,Sysadmin 104,Anand Ram,Developer 105,Jane Miller,Sales Manager
从文件中读取sed-commands
# vim script.sed /admin/ p /IT/ p # sed -n -f script.sed employee.txt 102,Jason Smith,IT Manager 103,Raj Reddy,Sysadmin
使用-e指定多个sed-commands(方法一)
# sed -n -e ‘/admin/p‘ -e ‘/IT/p‘ employee.txt 102,Jason Smith,IT Manager 103,Raj Reddy,Sysadmin
使用-e指定多个sed-commands(方法二)
# sed -n > -e ‘/admin/p‘ > -e ‘/IT/p‘ > employee.txt 102,Jason Smith,IT Manager 103,Raj Reddy,Sysadmin
使用-e指定多个sed-commands(方法二)
打印第二行
# sed -n ‘2 p‘ employee.txt 102,Jason Smith,IT Manager
打印第一行到第四行
# sed -n ‘1,4 p‘ employee.txt 101,John Doe,CEO 102,Jason Smith,IT Manager 103,Raj Reddy,Sysadmin 104,Anand Ram,Developer
打印第二行到最后一行
# sed -n ‘2,$ p‘ employee.txt 102,Jason Smith,IT Manager 103,Raj Reddy,Sysadmin 104,Anand Ram,Developer 105,Jane Miller,Sales Manager
打印从第一行开始的2行
# sed -n ‘1,+2 p‘ employee.txt 101,John Doe,CEO 102,Jason Smith,IT Manager 103,Raj Reddy,Sysadmin
打印奇数行
# sed -n ‘1~2 p‘ employee.txt 101,John Doe,CEO 103,Raj Reddy,Sysadmin 105,Jane Miller,Sales Manager
打印偶数行
# sed -n ‘2~2 p‘ employee.txt 102,Jason Smith,IT Manager 104,Anand Ram,Developer
删除第二行
# sed ‘2 d‘ employee.txt 101,John Doe,CEO 103,Raj Reddy,Sysadmin 104,Anand Ram,Developer 105,Jane Miller,Sales Manager
删除第三行到最后一行
# sed ‘3,$ d‘ employee.txt 101,John Doe,CEO 102,Jason Smith,IT Manager
删除空行
# sed ‘/^$/ d‘ employee.txt
删除以#开始的注释行
sed ‘/^#/ d‘ employee.txt
把employee.txt的偶数行写入到output.txt
# sed -n ‘2 w output.txt‘ employee.txt # cat output.txt 102,Jason Smith,IT Manager
把Manager改成Director
# 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
搜索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
搜索替换一行中所有的小写字母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
搜索替换一行中第二个出现的小写字母a为大写字母A
[root@unp ~]# 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
搜索包含John的行并替换为Jonny,仅打印此行
# sed -n ‘s/John/Jonny/p‘ employee.txt 101,Jonny Doe,CEO
搜索包含John的行并替换为Jonny,写入到文件output.txt
# sed -n ‘s/John/Jonny/w output.txt‘ employee.txt # cat output.txt 101,Jonny Doe,CEO
搜索包含John的行(忽略大小写)并替换为Jonny,写入到文件output.txt
# sed -n ‘s/john/Jonny/iw output.txt‘ employee.txt # cat output.txt 101,Jonny Doe,CEO
在第1到2行的前面的行首插入<<,行尾插入>>
# sed -e ‘1,2s/^/<< /‘ -e ‘1,2s/$/ >>/‘ employee.txt << 101,John Doe,CEO >> << 102,Jason Smith,IT Manager >>
sed搜索定界符也可使用以下几种形式
sed ‘s|/usr/local/bin|/usr/bin|‘ input-file sed ‘s^/usr/local/bin^/usr/bin^‘ input-file sed ‘s@/usr/local/bin@/usr/bin@‘ input-file sed ‘s!/usr/local/bin!/usr/bin!‘ input-file
&用于替换匹配的oritinal-string
# sed ‘s/^[0-9]\{3\}/[&]/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 # sed -r ‘s/^[0-9]{3}/[&]/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
单分组引用
# sed ‘s/\([^,]*\).*/\1/g‘ employee.txt 101 102 103 104 105
多分组引用
# sed ‘s/\([^,]*\),\([^,]*\),\([^,]*\).*/\1,\3/g‘ employee.txt 101,CEO 102,IT Manager 103,Sysadmin 104,Developer 105,Sales Manager
\l表示把后面的单个字符N视为小写n,\L表示将后面的所有字符HNNY视为小写hnny
# sed -n ‘s/John/JO\LHNNY/p‘ employee.txt 101,JOhnny Doe,CEO # sed -n ‘s/John/JO\lHNNY/p‘ employee.txt 101,JOhNNY Doe,CEO
\u表示把后面的单个字符n视为大写N,\U表示将后面的所有字符hnny视为大写HNNY
# sed -n ‘s/John/JO\uhnny/p‘ employee.txt 101,JOHnny Doe,CEO # sed -n ‘s/John/JO\Uhnny/p‘ employee.txt 101,JOHNNY Doe,CEO
\E和\L \U配合使用,作为定界符
# sed -n ‘s/John/JO\Uhnn\Ey/p‘ employee.txt 101,JOHNNy Doe,CEO
把\3改为大写
# sed ‘s/\([^,]*\),\([^,]*\),\([^,]*\).*/\1,\U\3\E/g‘ employee.txt 101,CEO 102,IT MANAGER 103,SYSADMIN 104,DEVELOPER 105,SALES MANAGER
把sed作为一个解释器来用
# cat script.sed #!/bin/sed -f s/\([^,]*\),\([^,]*\),\([^,]*\).*/\2,\1,\3/g s/^.*/<&>/ s/Developer/IT Manager/ s/Manager/Director/ # ./script.sed employee.txt <John Doe,101,CEO> <Jason Smith,102,IT Director> <Raj Reddy,103,Sysadmin> <Anand Ram,104,IT Director> <Jane Miller,105,Sales Director>
直接修改原文件
# sed -i ‘s/John/Johnny/‘ employee.txt # cat employee.txt 101,Johnny Doe,CEO 102,Jason Smith,IT Manager 103,Raj Reddy,Sysadmin 104,Anand Ram,Developer 105,Jane Miller,Sales Manager
直接修改原文件,并备份原文件
# sed -ibak ‘s/John/Johnny/‘ employee.txt # ll employee.txt* -rw-r--r-- 1 root root 123 Sep 15 18:05 employee.txt -rw-r--r-- 1 root root 121 Sep 15 18:05 employee.txtbak
直接修改原文件,并指定文件后缀名
# sed --in-place=.bak ‘s/John/Johnny/‘ employee.txt # ll employee.txt* -rw-r--r-- 1 root root 123 Sep 15 18:08 employee.txt -rw-r--r-- 1 root root 121 Sep 15 18:07 employee.txt.bak
追加a和插入i
# sed -e ‘1 i \Staff Information\n-------------‘ -e ‘$ a \END\n-------------‘ employee.txt Staff Information ------------- 101,Johnny Doe,CEO 102,Jason Smith,IT Manager 103,Raj Reddy,Sysadmin 104,Anand Ram,Developer 105,Jane Miller,Sales Manager END -------------
替换c
# sed ‘/Sales/ c \105,Jane Miller,Sales Director‘ employee.txt 101,Johnny Doe,CEO 102,Jason Smith,IT Manager 103,Raj Reddy,Sysadmin 104,Anand Ram,Developer 105,Jane Miller,Sales Director
打印隐藏字符
# sed -n ‘l‘ employee.txt 101,Johnny Doe,CEO$ 102,Jason Smith,IT Manager$ 103,Raj Reddy,Sysadmin$ 104,Anand Ram,Developer$ 105,Jane Miller,Sales Manager$
打印行号
# sed ‘=‘ employee.txt 1 101,Johnny Doe,CEO 2 102,Jason Smith,IT Manager 3 103,Raj Reddy,Sysadmin 4 104,Anand Ram,Developer 5 105,Jane Miller,Sales Manager
转换大小写字母
# sed ‘y/abcdefghijklmnopqrstuvwxyz/ABCDEFGHIJKLMNOPQRSTUVWXYZ/‘ employee.txt 101,JOHNNY DOE,CEO 102,JASON SMITH,IT MANAGER 103,RAJ REDDY,SYSADMIN 104,ANAND RAM,DEVELOPER 105,JANE MILLER,SALES MANAGER
多个input-file
# sed -n ‘/^root\>/ p‘ /etc/{passwd,group} root:x:0:0:root:/root:/bin/bash root:x:0:
退出命令q
# sed ‘q‘ employee.txt 101,Johnny Doe,CEO # sed ‘2q‘ employee.txt 101,Johnny Doe,CEO 102,Jason Smith,IT Manager
命令n:用于打印当前模式空间,并从input-file中读入下一行
# sed ‘n‘ employee.txt 101,Johnny Doe,CEO 102,Jason Smith,IT Manager 103,Raj Reddy,Sysadmin 104,Anand Ram,Developer 105,Jane Miller,Sales Manager
本文出自 “虎虎生威” 博客,请务必保留此出处http://tobeone.blog.51cto.com/817917/1553001
标签:sed
原文地址:http://tobeone.blog.51cto.com/817917/1553001