文本处理sed
Sed介绍:
处理文本的工具sed ,Stream EDitor, 行编辑器
sed是一种流编辑器,它一次处理一行内容。处理时,把当前处理的行存储在临时缓冲区中,称为“模式空间”(pattern space),接着用sed命令处理缓冲区中的内容,处理完成后,把缓冲区的内容送往屏幕。接着处理下一行,这样不断重复,直到文件末尾。文件内容并没有改变,除非你使用重定向存储输出。Sed主要用来自动编辑一个或多个文件,简化对文件的反复操作,编写转换程序等
在linux中文件的行结尾用二进制为0a表示结尾
在windows中文件的行结尾用二进制为0d
0a表示结尾
Sed简单用法:
用法:
sed[option]… ‘script’ inputfile…
常用选项:
-n:不输出模式空间内容到屏幕,即不自动打印
-e: 多点编辑
-f:/PATH/SCRIPT_FILE: 从指定文件中读取编辑脚本
-r: 支持使用扩展正则表达式
-i.bak(文件后缀): 备份文件并原处编辑(用于修改文件很危险的操作建议使用时备份)
script:
‘地址命令‘(表示要对那些文件操作的条件,对那些行的操作)
地址定界:
(1) 不给地址:对全文进行处理
(2) 单地址:
#: 指定的行
/pattern(正则表达式)/:被此处模式所能够匹配到的每一行
(3) 地址范围:
#,#
#,+#(表示为#行以后的+#行)
/pat1/,/pat2/ 显示pat1 和pat2之间的行都会显示
#,/pat1/ (从#到pat1 最先发现pat1停止)
(4) ~:步进
1~2 奇数行(以1开始每次增加2为步进)
2~2 偶数行(以2开始每次增加2为步进数)
取出文件的偶数行:
Cat –n /etc/passwd |Sed –n ‘2~2p’
d: 删除模式空间匹配的行
p: 显示模式空间中的内容(将一个行再打印一遍)
a [\]text:在指定行后面追加文本,支持使用\n实现多行追加
i[\]text:在行前面插入文本
c [\]text:替换行为单行或多行文本
将一行分为两行表示
w /path/somefile: 保存模式匹配的行至指定文件(保存到别的文件里)
r /path/somefile:读取指定文件的文本至模式空间中匹配到的行后
=: 为模式空间中的行打印行号
!:模式空间中匹配行取反处理
s///:查找替换,支持使用其它分隔符,s@@@,s###
替换标记:
g: 行内全局替换
p: 显示替换成功的行(与-n组合使用)
w /PATH/TO/SOMEFILE:将替换成功的行保存至文件中
例:修改系统当前版本号(sed -i.bak ‘s/6.8/8.8/’
/etc/centos-release)
sed示例:
sed ‘2p’ /etc/passwd 将第二行在打印一次
sed –n ‘2p’
/etc/passwd 只打印显示第二行
sed –n ‘1,4p’ /etc/passwd 只打印1到4行的内容
sed –n ‘/root/p’
/etc/passwd 只打印 包含/root/的行
sed –n ‘2,
/root/p’ /etc/passwd 从2行开始到包含/root/的行进行打印
sed -n ‘/^$/=’ file 显示空白行的行号
sed –n –e ‘/^$/p’ –e ‘/^$/=’
file
sed ‘/root/a\superman’ /etc/passwd行后 在/root/de后插入superman
sed ‘/root/i\superman’ /etc/passwd行前 在/root/前面插入superman
sed ‘/root/c\superman’ /etc/passwd代替行 用superman替代/root/的行
sed ‘/^$/d’ file 删除空白行
sed ‘1,10d’ file 删除1到10行
nl /etc/passwd| sed ‘2,5d’ 删除2到5行
nl /etc/passwd| sed ‘2a tea’ 在a的后面插入sed
sed ‘s/test/mytest/g’ example 将test全局替换为mytest
sed –n
‘s/root/&superman/p’ /etc/passwd单词后(& 代表前面搜索到的内容)
sed –n
‘s/root/superman&/p’
/etc/passwd单词前
sed -e ‘s/dog/cat/’
-e ‘s/hi/lo/’ pets (多点操作 -e) 在将dog替换为cat的同时 也将hi替换为lo
sed –i.bak ‘s/dog/cat/g’ pets 修改文件将dog全局替换为cat,并且备份文件为.bak后缀的文件
列:将ifconfig eth0的IP地址取出来
ifconfig eth0|sed -n 2p|sed -e ‘s/.*r://’
-e ‘s/ B.*//’
ifconfig eth0|sed -e ‘s/.*inet addr://’ -e ‘s/ B.*//’ -n -e 2p
取基名(利用正则表达式的分组)
echo
/etc/sysconfig/network-scripts/ |sed -r
‘s@(^/.*/)([^/]+/?)@\2@’
取目录名
echo
/etc/sysconfig/network-scripts/ |sed -r
‘s@(^/.*/)([^/]+/?)@\1@’
替换文件内的非#开头的以#开头
sed -r
‘s/(^[^#])/#\1/’ /etc/fstab
sed -r ‘s/^[^#]/#&/’ /etc/fstab
Sed高级用法:(在sed的模式空间上增加一个保持空间)
h: 把模式空间中的内容覆盖至保持空间中
H:把模式空间中的内容追加至保持空间中
g: 从保持空间取出数据覆盖至模式空间
G:从保持空间取出内容追加至模式空间
x: 把模式空间中的内容与保持空间中的内容进行互换
n: 读取匹配到的行的下一行覆盖至模式空间
N:读取匹配到的行的下一行追加至模式空间
d: 删除模式空间中的行
D:删除当前模式空间开端至\n的内容(不再传至标准输出),放弃之后的令,但是对剩余模式空间重新执行sed
sed示例:
sed -n ‘n;p’
FILE (与-n组合使用隔行打印)
获取ip:ifconfig eth0 |sed ‘2!d;s/.*r://;s/
B.*//’
sed ‘1!G;h;$!d’ FILE (倒序打印)
sed ‘$!N;$!D’ FILE (只保留最后两行)
sed ‘$!d’ FILE (显示最后一行)
sed ‘G’ FILE (格一行显示)
sed ‘g’ FILE (显示下一行)
sed ‘/^$/d;G’ FILE
sed ‘n;d’ FILE 隔行显示
sed -n ‘1!G;h;$p’ FILE
原创文章,作者:GYF,如若转载,请注明出处:http://www.178linux.com/74756