sed命令入门及进阶

sed命令入门及进阶

sed:stream EDitor ,行编辑器:


运行机制:
不对文件进行原地编辑,而是一次从指定文件中读取一行,读取至模式空间中,基于预先给定的编辑脚本,对模式空间中的内容进行编辑,编辑完成后的结果输出至屏幕;

pattern space:模式空间
hold space : 保持空间

用法:

sed [option]... 'script' inputfile...

script:
格式:
'地址命令'

【注意】地址和命令间无空格

常用选项:
-n : 不输出模式空间中的内容至屏幕;
-e : 实现多点编辑功能;
-f /PATH/TO/SCRIPT_FILE : 从指定文件中读取编辑脚本,脚本中每行有一个执行命令;
-r : 使用扩展正则表达式,默认是基本的grep
-i : 原地编辑,修改原文件;
如:
~]# sed -i.bak '2,4d' file1
~]# ls file1 file1.bak

地址定界:
三种情况:
1、不给地址:对全文进行处理;
2、单一地址:
# : 指定的行
/pattren/ : 被此处模式所能匹配到的每一行;
3、地址范围:
#,# :
#,+# :
/pattern1/,/pattern2/ : 
#,/pattern1/ :
4、~ :步进
1~2 :读所有奇数行
2~2 :读所有偶数行

如:~]# seq 10 | sed -n '1~2p'

编辑命令:
d :删除
如:删除匹配指定模式的行后输出:
~]# sed '/^UUID/d' /etc/fstab
~]# sed '/nosuid/d' /proc/mounts
删除1-4行:
~]# sed '1,4d' /etc/fstab

p :显示模式空间中能被pattern匹配到的内容
如:将模式空间中的内容输出至屏幕的同时,将符合pattern匹配的行也输出至屏幕:
~]# sed '/^UUID/p' /etc/fstab
不输出模式空间中的内容至屏幕,仅显示模式空间中能被pattern匹配到的行到屏幕:
~]# sed -n '/^UUID/p' /etc/fstab

【notes】以下两条命令的效果刚好相反:
~]# sed '/^UUID/p' /etc/fstab
~]# sed -n '/^UUID/p' /etc/fstab

a [\]text : 在符合pattern模式的行后面追加 text 的文本内容,支持使用\n实现多行追加

如:
~]# seq 10 | sed '1,4a\========='
~]# seq 10 | sed '1,4a\    ========='
~]# seq 10 | sed '1,4a\    =====\n     +++++'

i [\]text : 在符合pattern模式的行前面插入 text 的文本内容,支持使用\n实现多行插入

c [\]text : 替换符合pattern模式的整行为 text 文本

w /path/to/somefile :将符合条件的内容存入到某文件
如:
~]# sed '/^UUID/w /test_files/fstab.txt' /etc/fstab

r /path/from/somefile : 将指定路径的文件内容读取到当前文件中符合条件的每一行后面;
如:读取/etc/issue文件内容至【某一行】后面:
~]# sed -n '6r /etc/issue' /etc/fstab
读取/etc/issue文件内容至符合条件的【每一行】后:
~]# sed -n '/^UUID/r /etc/issue' /etc/fstab

= : 为模式空间中的行打印行号
如:~]# sed '/^\/dev/=' /etc/fstab

! : 取反条件
如:
~]# sed '/^UUID/d' /etc/fstab

取反:
~]# sed '/^UUID/!d' /etc/fstab
等于:
~]# sed -n '/^UUID/p' /etc/fstab

s /// :查找替换,支持其他分隔符,s@@@,s###;
替换标记:
g :行内全局替换
p :仅显示替换成功的行
w /PATH/TO/SOMEFILE : 将替换成功的结果保存至指定文件中

如:~]# sed 's@dev@DEV@g' /etc/fstab

后向引用:
如:将以f...t 格式的内容后面加ABC:
~]# sed 's@f...t@&ABC@g' /etc/fstab
也可以是:
~]# sed 's@\(f...t\)@\1ABC@p' /etc/fstab


练习:
1、删除/var/log/boot.log文件中所有以空白开头的行行首的空白字符;
解:
~]# sed 's/^[[:space:]]\+//g' /var/log/boot.log
2、删除/etc/fstab文件中所有以#开头,后面至少跟一个空白字符的行的行首的#和空白字符;
解答:
~]# sed 's@^#[[:space:]]\+@@g' /etc/fstab

3、echo一个绝对路径给sed命令,去除其基名和目录名;
解答:
取基名:
~]# 

取目录名:
]# echo -e "/etc/fstab\n/etc/init.d/inittab/"  | sed 's@\<[^/]\+/\?$@@'



sed高级编辑命令:
h :把模式空间中的内容覆盖至保持空间中
H :把模式空间中的内容追加至保持空间中
g :从保持空间中取出数据覆盖至模式空间
G :从保持空间中取出数据追加至模式空间
x :把模式空间中的内容与保持空间中的内容进行互换
n :读取匹配到的行的下一行覆盖至模式空间
N :读取匹配到的行的下一行追加至模式空间
d :删除模式空间中的行
D :删除多行模式空间中的行


seq一段从1开始的数字,取出其中的偶数行:
~]# seq 10 | sed -n 'n;p'

逐行逆序显示文件内容:
~]# seq 10 | sed '1!G;h;$!d'

显示文件后两行:
~]# seq 10 | sed '$!N;$!D'

显示文件后1行:
~]# seq 10 | sed '$!D'

每两行之间加一个空白行:
~]# seq 10 | sed 'G' 

删除所有空白行,然后在每两行之间加一个空白行:
~]# sed '/^$/d;G' FILE

显示奇数行:
~]# seq 10 | sed 'n;d'

逐行逆序显示文件内容:
~]# seq 10 | sed -n '1!G;h;$p'
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值