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'
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'