sed
--stream editor
编辑器的分类:
1、行编辑器
ed 升级版:sed
2、全屏编辑器
vi vim gedit emacs nano
sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。(通过非交互式来修改文本中的内容)
1、常用模式:
命令行模式 sed '' file
脚本模式 sed -f sed.txt file
建议使用 ./sed.sh
脚本的第一行写上
#!/bin/sed -f
命令行模式:
格式:sed [options] 'command' file(s)
sed '10s/:/?/' /etc/passwd
options 部分(命令行标志)
-n 不输出所有的行,只复制 p 函数或在 s 函数之后 p 标志所指定的行
-e 下一个参数接受为编辑命令,允许多项编辑,如只传递一个编辑命令给sed,可以省略
-i 直接修改目标文件(如无此标志则只显示操作结果到标准输出)
-f 将下一个参数作为脚本文件名处理,此脚本文件应该是包含分行的sed命令
-r 匹配扩展型的正则表达式
command 部分:[地址1,地址2][函数][参数]
1、地址是可以忽略的,一般情况下[地址1]是起始地址,[地址2]是结束地址
2、可以用任何数目的空格或制表符(tab)键把地址和函数分割开来
3、函数必须出现
4、依据给定的不同函数,组成command的标记某些必须,某些可选
5、引用shell script中的变量应使用双引号,而非通常使用的单引号
sed "s/local/$USER/gp" /etc/hosts
+++++++++++++++++++++++++++++
sed文本定位方法
x x为指定行号
x,y 指定从x到y的行号范围
/pattern/ 查询包含模式的行
/pattern/pattern/ 查询包含两个模式的行
/pattern/,x 从与pattern的匹配行到x号行之间的行
x,/pattern/ 从x号行到与pattern的匹配行之间的行
x,y! 查询不包括x和y行号的行
++++++++++++++++++++++++++++++
# sed -n '1p' /etc/passwd
# sed -n '1,2p' /etc/passwd
# sed -n /root/p /etc/passwd
# sed -n '/root/=' /etc/passwd
# sed -n -e '/root/p' -e '/root/=' /etc/passwd
# sed '/root:/a\we append a new line.' /etc/passwd |head -2
# sed '/^root:/ i #我是谁?'
# sed -n '10s/:/?/p' /etc/passwd
# sed 's/[0-9]//g' /etc/passwd
sed 匹配元字符
# sed -n '/\./p' /etc/passwd
# sed -n '/\$/p' /etc/shadow
# sed -n '5,$s/root/123/p' passwd
使用元字符进行匹配
# sed -n '$p' /etc/passwd
# sed -n '$'p /etc/passwd
# sed -n '/.*uu/p' /etc/passwd
# sed -n '2,10p' /etc/passwd
# sed -n -e '2,10p' -e '2,10=' /etc/passwd
# sed -n '/uu05/,$p' /etc/passwd
# sed -n '/root/,10p' /etc/passwd
# sed -n '3,/root/p' /etc/passwd
脚本模式:
脚本文件是一个sed的命令行清单
在每行的末尾不能有任何空格、制表符(tab)或其它文本
如果在一行中有多个命令,应该用逗号分隔
不需要且不可用引号保护命令
#号开头的行为注释
insert.sed
#!/bin/sed -f
/root:/i \
We insert a new line.
# ./insert.sed /etc/passwd |head
2、操作定位(数字(行号)、正则表达式或两者结合)
查找:
# sed -n '/root/p' /etc/passwd
# sed -n '/^root/p' /etc/passwd
# sed -n '1p' /etc/passwd
# sed -n '1,3p' /etc/passwd
1)十进制数字
例如:sed '1d' file
例如:sed '1,10s/foo/bar/' file
sed 's/foo/bar/' file
# sed 's/o/@/3' grep.txt
ggle
gogle
google
goo@gle
gagle
gaagle
gaaagle
abcgef
2)正则表达式
正则表达式必须以”/“前后规范间隔
例如:sed '/foo/d' file
例如:sed '/^foo/d' file
如果匹配的是扩展正则表达式,需要使用-r选来扩展sed
# sed -r -n 's/(([0-9]){1,3}\.){3}([0-9]){1,3}/IPIP/gp' /var/log/secure
# sed -i -r '/^#|^$/d' /var/tmp/vsftpd.conf == egrep -v '^#|^$' /var/tmp/vsftpd.conf
# sed -r -n -e 's/(([0-9a-zA-Z]{1,2}\:){5}[0-9a-zA-Z]{1,2})//g' -n -e 's/(([0-9]){1,3}\.){3}([0-9]){1,3}/IPIP/gp' mac.out
在正则表达式中如果出现特殊字符(^$.*/[]),需要以前导 ”\“ 号做转义
例如:sed '/\$foo/p' file
3)逗号分隔符
例如:sed '5,7d' file
例如:sed '/foo/,/bar/d' file --删除第一个匹配字符串"foo"到第一个匹配字符串"bar"的所有行本行不找 循环执行
sed -n '/^root/,/uucp/d' /etc/passwd
4)组合方式
例如:sed '1,/foo/d' file --删除第一行到第一个匹配字符串"foo"的所有行
例如:sed '/foo/,+4d' file --删除从匹配字符串”foo“开始到其后四行为止的行
例如:sed '/foo/,~3d' file --删除从匹配字符串”foo“从文本开始删除到第3行
例如:sed '1~5d' file --从第一行开始每五行删除一行
例如:sed -n '/foo\|bar/p' file --显示配置字符串"foo"或"bar"的行
sed -n '/foo/,/bar/p' file 显示匹配从foo到bar的行
sed '1~2d' file --删除奇数行
sed '0-2d' file --删除偶数行 sed '1~2!d' file
5)特殊情况
例如:sed '$d' file --删除最后一行
sed '1d' file
正则表达式的操作:
sed 's/.//' a.txt --删除每一行中的第一个字符
sed 's/.//2' a.txt --删除每一行中的第二个字符
sed 's/.$//' a.txt --删除每一行中的最后一个字符
(you) your
\(..\) 保存已匹配的字符 1,20s/\(you\)self/\1r/ 标记元字符之间的模式,并将其保存为标签1,之后可以使用\1来引用它。最多可以定义9个标签,从左边开始编号,最左边的是第一个。此例中,对第1到第20行进行处理,you被保存为标签1,如果发现youself,则替换为your。
#sed "s/Red Hat .* release 6.3 (\(.*\))/\1/" /etc/system-release
PRODUCT=$(sed "s/Red Hat \(.*\) release.*/\1/" /etc/system-release)
/etc/rc.d/rc.sysinit
3、函数
替换/删除/修改/追加/插入
1)替换
sed 's/aaa/AAA/gp' file
2)追加新行(a)
sed '/^root/a input your newline' /etc/passwd
--在文件中搜索以root开头的行,然后在这一行后追加一个新行,内容是:input your newline
sed '/^root/a\ input your newline' /etc/passwd
sed '5a hello all' /etc/passwd | nl
--在第5行后追加新行变成第6行,内容....
sed '$a hello all' /etc/passwd
--在最后一行的追加一行成为新的最后一行
3)插入:
# sed '/^root/i input your newline' /etc/passwd |nl --在^root上一行
# sed '5i hello all' /etc/passwd | nl --插入成为第五行
# sed '$i hello all' /etc/passwd --倒数第二行
4)修改(&),追加关键字:
# sed 's/root/&aa/g' /etc/passwd --搜索包含root,在原来的基本上加上aa变以rootaa
# sed 's/root/& aa/g' /etc/passwd --搜索包含root,在原来的基本上加上 aa变以root aa
# sed '1,10s/root/& aa/g' /etc/passwd
# sed '10s/root/&aa/g' /etc/passwd
# sed '10s/root/aa&/g' /etc/passwd
# sed -r 's/([0-9]{1,3}\.){3}[0-9]{1,3}/& :DENY/g' /etc/hosts.deny
# sed -r 's/([0-9]{1,3}\.){3}[0-9]{1,3}/ :DENY &/g' /etc/hosts.deny
# sed 's/\[base\]/#[base]/' aa.txt | head
#!/bin/bash
#这是一个测试脚本
#[base]
named=这是一个sed的脚本
baseurl=file:///iso
gpcheck=1
enabld=102233123183
编辑器的分类:
1、行编辑器
ed 升级版:sed
2、全屏编辑器
vi vim gedit emacs nano
sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件;简化对文件的反复操作;编写转换程序等。(通过非交互式来修改文本中的内容)
1、常用模式:
命令行模式 sed '' file
脚本模式 sed -f sed.txt file
建议使用 ./sed.sh
脚本的第一行写上
#!/bin/sed -f
命令行模式:
格式:sed [options] 'command' file(s)
sed '10s/:/?/' /etc/passwd
options 部分(命令行标志)
-n 不输出所有的行,只复制 p 函数或在 s 函数之后 p 标志所指定的行
-e 下一个参数接受为编辑命令,允许多项编辑,如只传递一个编辑命令给sed,可以省略
-i 直接修改目标文件(如无此标志则只显示操作结果到标准输出)
-f 将下一个参数作为脚本文件名处理,此脚本文件应该是包含分行的sed命令
-r 匹配扩展型的正则表达式
command 部分:[地址1,地址2][函数][参数]
1、地址是可以忽略的,一般情况下[地址1]是起始地址,[地址2]是结束地址
2、可以用任何数目的空格或制表符(tab)键把地址和函数分割开来
3、函数必须出现
4、依据给定的不同函数,组成command的标记某些必须,某些可选
5、引用shell script中的变量应使用双引号,而非通常使用的单引号
sed "s/local/$USER/gp" /etc/hosts
+++++++++++++++++++++++++++++
sed文本定位方法
x x为指定行号
x,y 指定从x到y的行号范围
/pattern/ 查询包含模式的行
/pattern/pattern/ 查询包含两个模式的行
/pattern/,x 从与pattern的匹配行到x号行之间的行
x,/pattern/ 从x号行到与pattern的匹配行之间的行
x,y! 查询不包括x和y行号的行
++++++++++++++++++++++++++++++
# sed -n '1p' /etc/passwd
# sed -n '1,2p' /etc/passwd
# sed -n /root/p /etc/passwd
# sed -n '/root/=' /etc/passwd
# sed -n -e '/root/p' -e '/root/=' /etc/passwd
# sed '/root:/a\we append a new line.' /etc/passwd |head -2
# sed '/^root:/ i #我是谁?'
# sed -n '10s/:/?/p' /etc/passwd
# sed 's/[0-9]//g' /etc/passwd
sed 匹配元字符
# sed -n '/\./p' /etc/passwd
# sed -n '/\$/p' /etc/shadow
# sed -n '5,$s/root/123/p' passwd
使用元字符进行匹配
# sed -n '$p' /etc/passwd
# sed -n '$'p /etc/passwd
# sed -n '/.*uu/p' /etc/passwd
# sed -n '2,10p' /etc/passwd
# sed -n -e '2,10p' -e '2,10=' /etc/passwd
# sed -n '/uu05/,$p' /etc/passwd
# sed -n '/root/,10p' /etc/passwd
# sed -n '3,/root/p' /etc/passwd
脚本模式:
脚本文件是一个sed的命令行清单
在每行的末尾不能有任何空格、制表符(tab)或其它文本
如果在一行中有多个命令,应该用逗号分隔
不需要且不可用引号保护命令
#号开头的行为注释
insert.sed
#!/bin/sed -f
/root:/i \
We insert a new line.
# ./insert.sed /etc/passwd |head
2、操作定位(数字(行号)、正则表达式或两者结合)
查找:
# sed -n '/root/p' /etc/passwd
# sed -n '/^root/p' /etc/passwd
# sed -n '1p' /etc/passwd
# sed -n '1,3p' /etc/passwd
1)十进制数字
例如:sed '1d' file
例如:sed '1,10s/foo/bar/' file
sed 's/foo/bar/' file
# sed 's/o/@/3' grep.txt
ggle
gogle
goo@gle
gagle
gaagle
gaaagle
abcgef
2)正则表达式
正则表达式必须以”/“前后规范间隔
例如:sed '/foo/d' file
例如:sed '/^foo/d' file
如果匹配的是扩展正则表达式,需要使用-r选来扩展sed
# sed -r -n 's/(([0-9]){1,3}\.){3}([0-9]){1,3}/IPIP/gp' /var/log/secure
# sed -i -r '/^#|^$/d' /var/tmp/vsftpd.conf == egrep -v '^#|^$' /var/tmp/vsftpd.conf
# sed -r -n -e 's/(([0-9a-zA-Z]{1,2}\:){5}[0-9a-zA-Z]{1,2})//g' -n -e 's/(([0-9]){1,3}\.){3}([0-9]){1,3}/IPIP/gp' mac.out
在正则表达式中如果出现特殊字符(^$.*/[]),需要以前导 ”\“ 号做转义
例如:sed '/\$foo/p' file
3)逗号分隔符
例如:sed '5,7d' file
例如:sed '/foo/,/bar/d' file --删除第一个匹配字符串"foo"到第一个匹配字符串"bar"的所有行本行不找 循环执行
sed -n '/^root/,/uucp/d' /etc/passwd
4)组合方式
例如:sed '1,/foo/d' file --删除第一行到第一个匹配字符串"foo"的所有行
例如:sed '/foo/,+4d' file --删除从匹配字符串”foo“开始到其后四行为止的行
例如:sed '/foo/,~3d' file --删除从匹配字符串”foo“从文本开始删除到第3行
例如:sed '1~5d' file --从第一行开始每五行删除一行
例如:sed -n '/foo\|bar/p' file --显示配置字符串"foo"或"bar"的行
sed -n '/foo/,/bar/p' file 显示匹配从foo到bar的行
sed '1~2d' file --删除奇数行
sed '0-2d' file --删除偶数行 sed '1~2!d' file
5)特殊情况
例如:sed '$d' file --删除最后一行
sed '1d' file
正则表达式的操作:
sed 's/.//' a.txt --删除每一行中的第一个字符
sed 's/.//2' a.txt --删除每一行中的第二个字符
sed 's/.$//' a.txt --删除每一行中的最后一个字符
(you) your
\(..\) 保存已匹配的字符 1,20s/\(you\)self/\1r/ 标记元字符之间的模式,并将其保存为标签1,之后可以使用\1来引用它。最多可以定义9个标签,从左边开始编号,最左边的是第一个。此例中,对第1到第20行进行处理,you被保存为标签1,如果发现youself,则替换为your。
#sed "s/Red Hat .* release 6.3 (\(.*\))/\1/" /etc/system-release
PRODUCT=$(sed "s/Red Hat \(.*\) release.*/\1/" /etc/system-release)
/etc/rc.d/rc.sysinit
3、函数
替换/删除/修改/追加/插入
1)替换
sed 's/aaa/AAA/gp' file
2)追加新行(a)
sed '/^root/a input your newline' /etc/passwd
--在文件中搜索以root开头的行,然后在这一行后追加一个新行,内容是:input your newline
sed '/^root/a\ input your newline' /etc/passwd
sed '5a hello all' /etc/passwd | nl
--在第5行后追加新行变成第6行,内容....
sed '$a hello all' /etc/passwd
--在最后一行的追加一行成为新的最后一行
3)插入:
# sed '/^root/i input your newline' /etc/passwd |nl --在^root上一行
# sed '5i hello all' /etc/passwd | nl --插入成为第五行
# sed '$i hello all' /etc/passwd --倒数第二行
4)修改(&),追加关键字:
# sed 's/root/&aa/g' /etc/passwd --搜索包含root,在原来的基本上加上aa变以rootaa
# sed 's/root/& aa/g' /etc/passwd --搜索包含root,在原来的基本上加上 aa变以root aa
# sed '1,10s/root/& aa/g' /etc/passwd
# sed '10s/root/&aa/g' /etc/passwd
# sed '10s/root/aa&/g' /etc/passwd
# sed -r 's/([0-9]{1,3}\.){3}[0-9]{1,3}/& :DENY/g' /etc/hosts.deny
# sed -r 's/([0-9]{1,3}\.){3}[0-9]{1,3}/ :DENY &/g' /etc/hosts.deny
# sed 's/\[base\]/#[base]/' aa.txt | head
#!/bin/bash
#这是一个测试脚本
#[base]
named=这是一个sed的脚本
baseurl=file:///iso
gpcheck=1
enabld=102233123183