sed

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值