对于sed修改文件时注意事项

问题1:修改后只剩下了一行代码(被修改代码)

sed -in '136s/80/8080/' /etc/httpd/conf/httpd.conf

原因:-n 为屏蔽默认输出,不打印文件所有行。导致输出结果只有一行,并且替换整个文件。

问题2:修改后多出了一行修改的内容发现位两行

sed -i ‘136s/80/8080/p’ /etc/httpd/conf/httpd.conf

原因:p为打印。修改后有打印了一行,所以会有这个出现两行的结果
具体原因:模式缓冲区。默认情况下会打印模式缓冲区的东西。
例子:

sed 'p' a.txt //输出结果所有的行都会有两行

==============================================``

附加一些sed的参数和使用方法:
-e参数的作用:
如果想要过滤多个条件,-e选项指定其后跟的也是sed编辑的指令

sed -n -e '/user/p' -e '/user/=' a.txt

g参数作用:
不加则只替换每行第一个字符,加了之后会替换所有的字符。

sed -i ‘s/aaa/bbb/g’ a.txt 

y参数作用:
将1替换为A,2替换为B,3替换为C

sed -i ‘y/123/ABC/’ a.txt

{}作用:
将匹配行的所有;换成I,第一个le换成99

sed  -i  ‘/aaa/{s/i/I/g;s/le/99/;}’  a.txt 

找到匹配行并在其下一行进行将11替换为99的操作

sed   -i   ‘/aaa/{n;s/11/99/;}’   a.txt 

===============================================================
附加一发曾经的笔记
sed 文本编辑器 (适合处理大文件)
1.sed 流处理编辑器
特点:1)非交互式基于匹配模式过滤及修改文本
2)逐行处理,并将结果输出到屏幕
3)可实现对文本的输出,删除,替换,复制,剪切,导入,导出等各种操作
格式:1)sed [选项] '指令' 文件
2)前置命令 | sed [选项] '编辑指令'
选项: -n 屏蔽默认输出(全部文本)
-i 直接修改文件内容
-r 启用扩展的正则表达式,若与其他选项一起使用,应作为首个选项
{} 可组合多个命令,以分号分割

 定址符,即[地址1[,地址2]]
-用来指定处理的起、止行数
-省略定址符时,默认逐行处理全部文本
-地址可表示为文本的"行号",活着用来匹配的"/正则表达式/"
例:  [root@pc207 ~]# sed -n '1,3p' /etc/passwd
    root:x:0:0:root:/root:/bin/bash
    bin:x:1:1:bin:/bin:/sbin/nologin
    daemon:x:2:2:daemon:/sbin:/sbin/nologin

处理动作:
p 打印行 2,4p 输出2-4行
2p;4p 输出第2行,第4行
/zhang/p 输出包含zhang的行(正则)
d 删除行 2,4d 删除2-4行
s 字符串替换 s/old/new 将每行的第一个old替换成new
s/old/new/3 将每行的第三个old替换成new
s/old/new/g 将文件中所有的old替换成new``
替换操作符/可换其他字符,便于修改文件路径

例:sed 's#/bin/bash#/sbin/sh#' /etc/passwd

输出文本:

示例                  含义解析
sed -n 'p' a.txt            输出所有行,等同于a t a.txt
sed -n '4p' a.txt           输出第4行
sed -n '4,7p' a.txt     输出4-7行
sed -n '4,+10p' a.txt       输出第4行及其后的10行内容
sed -n '/^bin/p' a.txt      输出以bin开头的行
sed -n 'p;n' a.txt      输出奇数行,n表示读入下一以行文本(隔行)
sed -n 'n;p' a.txt      输出偶数行,n表示读入下一以行文本(隔行)
sed -n '$=' a.txt           输出文本的行数

删除文本:

示例                  含义解析
sed '3,5d' a.txt            删除第3-5行
sed '/xml/d' a.txt      删除所有包含xml的行
sed '/xml/!d' a.txt     删除不包含xml的行,!符号表示取反
sed '/^install/d' a.txt     删除以install开头的行
sed '$d' a.txt          删除文本的最后一行
sed '/^$/d' a.txt           删除所有空行
(此例中只做输出,不更改,更改应加-i)

替换文本:

示例                  含义解析
sed 's/xml/XML/' a.txt      将每行中第一个xml替换成XML
sed 's/xml/XML/3' a.txt     将每行中第三个xml替换成XML
sed 's/xml/XML/g' a.txt     将所有xml替换成XML
sed 's/xml//g' a.txt        将每一个xml删除(替换为空串)
sed 's/doc/&s/g' a.txt      将所有的doc替换为docs,&代表查找串
sed '4,7s/^/#/' a.txt       将第4-7行注释调(行首加#)
sed 's/^#an/an/' a.txt      解除以#an开头行注释(去掉行首的#号)

(此例中只做输出,不更改,更改应加-i)

过滤出多个字符串:

sed -rn "/(字串1)|(字串2)/p"  a.txt
egrep  "(字串1)|(字串2)"  a.txt

第一个字符和最后一个字符对调
sed -r 's/^(.)(.*)(.)$/\3\2\1/' a.txt

sed的文本块处理动作
i 行前插入文本 2iYY 在第二行之前添加文本行"YY"
4,7iYY 在4-7行的每行前添加文本行
a 行后插入文本 2aYY 在第二行之后添加文本
/^XX/aYY 在以XX为开头的行之后添加文本
c 替换当前行 2cYY 第二行的内容修改为YY

案例:
[root@pc207 ~]# sed '1c XXX' /etc/hostname
XXX
[root@pc207 ~]# sed 'i XXX' /etc/hostname
XXX
pc207.tedu.cn
[root@pc207 ~]# sed 'a XXX' /etc/hostname
pc207.tedu.cn
XXX

文本导入导出
r 读取文本 3r b.txt 将第3行下方插入到b.txt
4,7r b.txt 将第4,7行每一行插入到b.txt
w 保存到文件 3w b.txt 将第3行另存为到b.txt
4,7w b.txt 将第4-7行另存为到b.txt

案例:
[root@pc207 ~]# sed '2r /etc/hostname' a.txt 
a
s
pc207.tedu.cn
[root@pc207 ~]# sed -i  '2w cc.txt' a.txt 
[root@pc207 ~]# cat cc.txt 
s

2.sed复制剪切
模式空间:1)存放当前处理的行,将处理结果输出
2)若当前行不符合处理条件,则原样输出
3)处理完当前行再读入下一行来处理
保留空间:1)作用类似于剪切板
2)默认存放一个空行(换行符\n)
基础动作:
H:模式空间----[追加]----->保持空间 —|
| 复制
h:模式空间----[覆盖]----->保持空间 —|
G:保持空间----[追加]----->模式空间 —|
|粘贴
g:保持空间----[覆盖]----->模式空间 —|

案例:
[root@pc207 ~]# sed '2H;5G' a.txt
1
2
3
4
5

2
[root@pc207 ~]# sed '2h;5G' a.txt
1
2
3
4
5
2
[root@pc207 ~]# sed '2h;5g' a.txt
1
2
3
4
2
[root@pc207 ~]# sed '2H;5g' a.txt
1
2
3
4

2

转载于:https://blog.51cto.com/slient/2043825

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值