一、什么是sed
sed(Stream EDitor)流编辑器,是一个非交互式的文本编辑器,它可以对文本文件和标准输入进行编辑,标准输入可以来自键盘输入、文件重定向、字符串、变量等。sed从文本的一个文本行或者标准输入中读取数据,将其复制到缓冲区,然后读取命令行或脚本的第一个命令,对此要求的行号进行编辑,重复此过程,直到命令行或者脚本中的所有命令都执行完毕。
sed适用于以下三种场景:
编辑相对交互式文本编辑器而言太大的文件。
编辑命令太傅在,在交互式文本编辑器中难以输入的情况
对文件扫描一遍,但是需要执行多个编辑函数的情况
二、sed命令组成部分
命令格式:sed [OPTION]... 'script' [input-file] ...
[OPTION]:sed 命令选项
script:sed脚本,由“地指定界编与辑命令组成”(注意此处地址定界与编辑命令中间没有任何符号)
三、sed命令常用选项及脚本详解
sed选项:
-n:不输入模式空间中的内容至屏幕
# sed '/^#/d' fstab UUID=ad88b2e2-0eac-45e8-80b3-742a642827d7 / xfs defaults 0 0 UUID=756954a4-022d-4da1-abe5-ed3dc587c95a /boot xfs defaults 0 0 UUID=19dba320-753d-45b3-9071-85ae514f46e0 /usr xfs defaults 0 0 UUID=67ffa57f-07e6-426f-8914-f04154a11b47 swap swap defaults 0 0 # sed -n '/^#/d' fstab # 此处没有任何显示,模式空间中的内容为^#开头的文件,而剩下的被编辑命令d所删除,所以没有任何显示 # sed '/^#/p' fstab # p为显示模式空间的内容,因为默认也显示,所以此处每行出现两次 # # # /etc/fstab # /etc/fstab # Created by anaconda on Fri Mar 4 08:36:03 2016 # Created by anaconda on Fri Mar 4 08:36:03 2016 # # # Accessible filesystems, by reference, are maintained under '/dev/disk' # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # # UUID=ad88b2e2-0eac-45e8-80b3-742a642827d7 / xfs defaults 0 0 UUID=756954a4-022d-4da1-abe5-ed3dc587c95a /boot xfs defaults 0 0 UUID=19dba320-753d-45b3-9071-85ae514f46e0 /usr xfs defaults 0 0 UUID=67ffa57f-07e6-426f-8914-f04154a11b47 swap swap defaults 0 0 # sed -n '/^#/p' fstab # # /etc/fstab # Created by anaconda on Fri Mar 4 08:36:03 2016 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info #
-e script,--expression=script:多点编辑
# sed -e '/^#/d' -e '/^$/d' fstab UUID=ad88b2e2-0eac-45e8-80b3-742a642827d7 / xfs defaults 0 0 UUID=756954a4-022d-4da1-abe5-ed3dc587c95a /boot xfs defaults 0 0 UUID=19dba320-753d-45b3-9071-85ae514f46e0 /usr xfs defaults 0 0 UUID=67ffa57f-07e6-426f-8914-f04154a11b47 swap swap defaults 0 0 # 删除以#号开头的行,删除以
-f /PATH/TO/SOMEFILE
指定文件,文件中每一行一个编辑命令
# cat sed_script # sed script /^#/d /^$/d # sed -f sed_script /etc/fstab UUID=ad88b2e2-0eac-45e8-80b3-742a642827d7 / xfs defaults 0 0 UUID=756954a4-022d-4da1-abe5-ed3dc587c95a /boot xfs defaults 0 0 UUID=19dba320-753d-45b3-9071-85ae514f46e0 /usr xfs defaults 0 0 UUID=67ffa57f-07e6-426f-8914-f04154a11b47 swap swap defaults 0 0
-i:直接编辑原文件(慎用)
# cp fstab fstab.bak # sed -f sed_script -i fstab # cat fstab UUID=ad88b2e2-0eac-45e8-80b3-742a642827d7 / xfs defaults 0 0 UUID=756954a4-022d-4da1-abe5-ed3dc587c95a /boot xfs defaults 0 0 UUID=19dba320-753d-45b3-9071-85ae514f46e0 /usr xfs defaults 0 0 UUID=67ffa57f-07e6-426f-8914-f04154a11b47 swap swap defaults 0 0
-r:支持使用扩展正则表达式
# sed -r '/^[[:space:]]*$/d' fstab # # /etc/fstab # Created by anaconda on Fri Mar 4 08:36:03 2016 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # UUID=ad88b2e2-0eac-45e8-80b3-742a642827d7 / xfs defaults 0 0 UUID=756954a4-022d-4da1-abe5-ed3dc587c95a /boot xfs defaults 0 0 UUID=19dba320-753d-45b3-9071-85ae514f46e0 /usr xfs defaults 0 0 UUID=67ffa57f-07e6-426f-8914-f04154a11b47 swap swap defaults 0 0 # 此处过滤出后空格行没有了
地址定界:
1、空地址:对全文进行处理;
# 上面在演示sed的OPTIONS时演示过了,可以参照上面的理解
2、单地址:
#:指定行
/pattern/:被次模式匹配到的每一行
# 此处相同,上面在演示sed的OPTIONS时演示过了,可以参照上面的理解
3、地址范围
#,#:1,3 一到三行
# sed '1,3d' fstab # Created by anaconda on Fri Mar 4 08:36:03 2016 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # UUID=ad88b2e2-0eac-45e8-80b3-742a642827d7 / xfs defaults 0 0 UUID=756954a4-022d-4da1-abe5-ed3dc587c95a /boot xfs defaults 0 0 UUID=19dba320-753d-45b3-9071-85ae514f46e0 /usr xfs defaults 0 0 UUID=67ffa57f-07e6-426f-8914-f04154a11b47 swap swap defaults 0 0
#,+#:1,+3 从第一行开始,向下三行的范围
# sed '2,+3d' fstab # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # UUID=ad88b2e2-0eac-45e8-80b3-742a642827d7 / xfs defaults 0 0 UUID=756954a4-022d-4da1-abe5-ed3dc587c95a /boot xfs defaults 0 0 UUID=19dba320-753d-45b3-9071-85ae514f46e0 /usr xfs defaults 0 0 UUID=67ffa57f-07e6-426f-8914-f04154a11b47 swap swap defaults 0 0 # cat fstab # # /etc/fstab # Created by anaconda on Fri Mar 4 08:36:03 2016 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # UUID=ad88b2e2-0eac-45e8-80b3-742a642827d7 / xfs defaults 0 0 UUID=756954a4-022d-4da1-abe5-ed3dc587c95a /boot xfs defaults 0 0 UUID=19dba320-753d-45b3-9071-85ae514f46e0 /usr xfs defaults 0 0 UUID=67ffa57f-07e6-426f-8914-f04154a11b47 swap swap defaults 0 0
#,/part1/:从某行开始到第一次被模式匹配到的行
# sed '2,/^#/d' fstab #删除第2行到匹配到的第一个以#号开头的行 # Created by anaconda on Fri Mar 4 08:36:03 2016 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # UUID=ad88b2e2-0eac-45e8-80b3-742a642827d7 / xfs defaults 0 0 UUID=756954a4-022d-4da1-abe5-ed3dc587c95a /boot xfs defaults 0 0 UUID=19dba320-753d-45b3-9071-85ae514f46e0 /usr xfs defaults 0 0 UUID=67ffa57f-07e6-426f-8914-f04154a11b47 swap swap defaults 0 0 # cat fstab # # /etc/fstab # Created by anaconda on Fri Mar 4 08:36:03 2016 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # UUID=ad88b2e2-0eac-45e8-80b3-742a642827d7 / xfs defaults 0 0 UUID=756954a4-022d-4da1-abe5-ed3dc587c95a /boot xfs defaults 0 0 UUID=19dba320-753d-45b3-9071-85ae514f46e0 /usr xfs defaults 0 0 UUID=67ffa57f-07e6-426f-8914-f04154a11b47 swap swap defaults 0 0
/part1/,/part2/:模式1匹配到的行到模式2匹配到的行
# sed '/^[^#]/,/^#/d' fstab # # /etc/fstab # Created by anaconda on Fri Mar 4 08:36:03 2016 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # # cat fstab # # /etc/fstab # Created by anaconda on Fri Mar 4 08:36:03 2016 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # UUID=ad88b2e2-0eac-45e8-80b3-742a642827d7 / xfs defaults 0 0 UUID=756954a4-022d-4da1-abe5-ed3dc587c95a /boot xfs defaults 0 0 UUID=19dba320-753d-45b3-9071-85ae514f46e0 /usr xfs defaults 0 0 UUID=67ffa57f-07e6-426f-8914-f04154a11b47 swap swap defaults 0 0
$:最后一行
# sed -n '$p' fstab UUID=67ffa57f-07e6-426f-8914-f04154a11b47 swap swap defaults 0 0 # cat fstab # # /etc/fstab # Created by anaconda on Fri Mar 4 08:36:03 2016 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # UUID=ad88b2e2-0eac-45e8-80b3-742a642827d7 / xfs defaults 0 0 UUID=756954a4-022d-4da1-abe5-ed3dc587c95a /boot xfs defaults 0 0 UUID=19dba320-753d-45b3-9071-85ae514f46e0 /usr xfs defaults 0 0 UUID=67ffa57f-07e6-426f-8914-f04154a11b47 swap swap defaults 0 0
4、步进 ~
1~2:所有奇数行
2~2:所有偶数行
# sed -n '1~2p' fstab # /etc/fstab # # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info UUID=ad88b2e2-0eac-45e8-80b3-742a642827d7 / xfs defaults 0 0 UUID=19dba320-753d-45b3-9071-85ae514f46e0 /usr xfs defaults 0 0 # sed -n '2~2p' fstab # # Created by anaconda on Fri Mar 4 08:36:03 2016 # Accessible filesystems, by reference, are maintained under '/dev/disk' # UUID=756954a4-022d-4da1-abe5-ed3dc587c95a /boot xfs defaults 0 0 UUID=67ffa57f-07e6-426f-8914-f04154a11b47 swap swap defaults 0 0 # cat fstab # # /etc/fstab # Created by anaconda on Fri Mar 4 08:36:03 2016 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # UUID=ad88b2e2-0eac-45e8-80b3-742a642827d7 / xfs defaults 0 0 UUID=756954a4-022d-4da1-abe5-ed3dc587c95a /boot xfs defaults 0 0 UUID=19dba320-753d-45b3-9071-85ae514f46e0 /usr xfs defaults 0 0 UUID=67ffa57f-07e6-426f-8914-f04154a11b47 swap swap defaults 0 0
编辑命令:
d:删除被模式匹配到的行
p:显示模式空间中的内容
a \text:在行后面追加文本“text”,支持使用\n实现多行追加
# sed '/^#/a \new line' fstab # new line # /etc/fstab new line # Created by anaconda on Fri Mar 4 08:36:03 2016 new line # new line # Accessible filesystems, by reference, are maintained under '/dev/disk' new line # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info new line # new line UUID=ad88b2e2-0eac-45e8-80b3-742a642827d7 / xfs defaults 0 0 UUID=756954a4-022d-4da1-abe5-ed3dc587c95a /boot xfs defaults 0 0 UUID=19dba320-753d-45b3-9071-85ae514f46e0 /usr xfs defaults 0 0 UUID=67ffa57f-07e6-426f-8914-f04154a11b47 swap swap defaults 0 0
i \text:在行前面插入文本“text”,支持使用\n实现多行插入
# sed '/^#/i \new line' fstab new line # new line # /etc/fstab new line # Created by anaconda on Fri Mar 4 08:36:03 2016 new line # new line # Accessible filesystems, by reference, are maintained under '/dev/disk' new line # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info new line # UUID=ad88b2e2-0eac-45e8-80b3-742a642827d7 / xfs defaults 0 0 UUID=756954a4-022d-4da1-abe5-ed3dc587c95a /boot xfs defaults 0 0 UUID=19dba320-753d-45b3-9071-85ae514f46e0 /usr xfs defaults 0 0 UUID=67ffa57f-07e6-426f-8914-f04154a11b47 swap swap defaults 0 0
c \text:把匹配到的行替换为此处指定的文本“text”
# sed '/^#/c \new line' fstab new line new line new line new line new line new line new line UUID=ad88b2e2-0eac-45e8-80b3-742a642827d7 / xfs defaults 0 0 UUID=756954a4-022d-4da1-abe5-ed3dc587c95a /boot xfs defaults 0 0 UUID=19dba320-753d-45b3-9071-85ae514f46e0 /usr xfs defaults 0 0 UUID=67ffa57f-07e6-426f-8914-f04154a11b47 swap swap defaults 0 0
w /PATH/TO/SOMEFILE:保存模式空间匹配到的行至指定的文件中
# sed -n '/^#/w newfile1' fstab # cat newfile1 # # /etc/fstab # Created by anaconda on Fri Mar 4 08:36:03 2016 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info #
r /PATH/FROM/SOMEFILE:读取指定文件的内容至当前文件被模式匹配到的行后面;文件合并
# sed '/^[[:space:]]*$/r newfile' fstab # how are you # how old are you # where are you going # # /etc/fstab # Created by anaconda on Fri Mar 4 08:36:03 2016 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # UUID=ad88b2e2-0eac-45e8-80b3-742a642827d7 / xfs defaults 0 0 UUID=756954a4-022d-4da1-abe5-ed3dc587c95a /boot xfs defaults 0 0 UUID=19dba320-753d-45b3-9071-85ae514f46e0 /usr xfs defaults 0 0 UUID=67ffa57f-07e6-426f-8914-f04154a11b47 swap swap defaults 0 0
=:为模式匹配到的行打印行号
# sed '/^#/=' fstab 2 # 3 # /etc/fstab 4 # Created by anaconda on Fri Mar 4 08:36:03 2016 5 # 6 # Accessible filesystems, by reference, are maintained under '/dev/disk' 7 # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info 8 # UUID=ad88b2e2-0eac-45e8-80b3-742a642827d7 / xfs defaults 0 0 UUID=756954a4-022d-4da1-abe5-ed3dc587c95a /boot xfs defaults 0 0 UUID=19dba320-753d-45b3-9071-85ae514f46e0 /usr xfs defaults 0 0 UUID=67ffa57f-07e6-426f-8914-f04154a11b47 swap swap defaults 0 0
!:条件取反
地址定界!编辑命令
# sed -n '/^#/p' fstab # # /etc/fstab # Created by anaconda on Fri Mar 4 08:36:03 2016 # # Accessible filesystems, by reference, are maintained under '/dev/disk' # See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info # # sed -n '/^#/!p' fstab UUID=ad88b2e2-0eac-45e8-80b3-742a642827d7 / xfs defaults 0 0 UUID=756954a4-022d-4da1-abe5-ed3dc587c95a /boot xfs defaults 0 0 UUID=19dba320-753d-45b3-9071-85ae514f46e0 /usr xfs defaults 0 0 UUID=67ffa57f-07e6-426f-8914-f04154a11b47 swap swap defaults 0 0
s///:查找替换,其分隔符可自行指定,常用的有s@@@, s###等
替换标记:
g:全局替换
w /PATH/TO/SOMEFILE:将替换成功的结果保存至指定文件中
p:显示替换成功的行
# 删除/etc/grub2.cfg
# sed 's@^[[:space:]]\+@@' /etc/grub2.cfg
#
# DO NOT EDIT THIS FILE
#
# It is automatically generated by grub2-mkconfig using templates
# from /etc/grub.d and settings from /etc/default/grub
#
### BEGIN /etc/grub.d/00_header ###
set pager=1
if [ -s $prefix/grubenv ]; then
load_env
fi
if [ "${next_entry}" ] ; then
set default="${next_entry}"
set next_entry=
save_env next_entry
set boot_once=true
else
set default="${saved_entry}"
fi
if [ x"${feature_menuentry_id}" = xy ]; then
menuentry_id_option="--id"
else
menuentry_id_option=""
fi
export menuentry_id_option
if [ "${prev_saved_entry}" ]; then
set saved_entry="${prev_saved_entry}"
save_env saved_entry
set prev_saved_entry=
save_env prev_saved_entry
set boot_once=true
fi
function savedefault {
if [ -z "${boot_once}" ]; then
saved_entry="${chosen}"
save_env saved_entry
fi
}
function load_video {
if [ x$feature_all_video_module = xy ]; then
insmod all_video
else
insmod efi_gop
insmod efi_uga
insmod ieee1275_fb
insmod vbe
insmod vga
insmod video_bochs
insmod video_cirrus
fi
}
terminal_output console
if [ x$feature_timeout_style = xy ] ; then
set timeout_style=menu
set timeout=5
# Fallback normal timeout code in case the timeout_style feature is
# unavailable.
else
set timeout=5
fi
### END /etc/grub.d/00_header ###
### BEGIN /etc/grub.d/00_tuned ###
set tuned_params=""
### END /etc/grub.d/00_tuned ###
### BEGIN /etc/grub.d/01_users ###
if [ -f ${prefix}/user.cfg ]; then
source ${prefix}/user.cfg
if [ -n ${GRUB2_PASSWORD} ]; then
set superusers="root"
export superusers
password_pbkdf2 root ${GRUB2_PASSWORD}
fi
fi
### END /etc/grub.d/01_users ###
### BEGIN /etc/grub.d/10_linux ###
menuentry 'CentOS Linux (3.10.0-327.el7.x86_64) 7 (Core)' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-3.10.0-327.el7.x86_64-advanced-ad88b2e2-0eac-45e8-80b3-742a642827d7' {
load_video
set gfxpayload=keep
insmod gzio
insmod part_msdos
insmod xfs
set root='hd0,msdos1'
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1 --hint='hd0,msdos1' 756954a4-022d-4da1-abe5-ed3dc587c95a
else
search --no-floppy --fs-uuid --set=root 756954a4-022d-4da1-abe5-ed3dc587c95a
fi
linux16 /vmlinuz-3.10.0-327.el7.x86_64 root=UUID=ad88b2e2-0eac-45e8-80b3-742a642827d7 ro rhgb quiet LANG=en_US.UTF-8
initrd16 /initramfs-3.10.0-327.el7.x86_64.img
}
menuentry 'CentOS Linux (0-rescue-94b3ec34f75d44df93cc011c79159864) 7 (Core)' --class centos --class gnu-linux --class gnu --class os --unrestricted $menuentry_id_option 'gnulinux-0-rescue-94b3ec34f75d44df93cc011c79159864-advanced-ad88b2e2-0eac-45e8-80b3-742a642827d7' {
load_video
insmod gzio
insmod part_msdos
insmod xfs
set root='hd0,msdos1'
if [ x$feature_platform_search_hint = xy ]; then
search --no-floppy --fs-uuid --set=root --hint-bios=hd0,msdos1 --hint-efi=hd0,msdos1 --hint-baremetal=ahci0,msdos1 --hint='hd0,msdos1' 756954a4-022d-4da1-abe5-ed3dc587c95a
else
search --no-floppy --fs-uuid --set=root 756954a4-022d-4da1-abe5-ed3dc587c95a
fi
linux16 /vmlinuz-0-rescue-94b3ec34f75d44df93cc011c79159864 root=UUID=ad88b2e2-0eac-45e8-80b3-742a642827d7 ro rhgb quiet
initrd16 /initramfs-0-rescue-94b3ec34f75d44df93cc011c79159864.img
}
### END /etc/grub.d/10_linux ###
### BEGIN /etc/grub.d/20_linux_xen ###
### END /etc/grub.d/20_linux_xen ###
### BEGIN /etc/grub.d/20_ppc_terminfo ###
### END /etc/grub.d/20_ppc_terminfo ###
### BEGIN /etc/grub.d/30_os-prober ###
### END /etc/grub.d/30_os-prober ###
### BEGIN /etc/grub.d/40_custom ###
# This file provides an easy way to add custom menu entries. Simply type the
# menu entries you want to add after this comment. Be careful not to change
# the 'exec tail' line above.
### END /etc/grub.d/40_custom ###
### BEGIN /etc/grub.d/41_custom ###
if [ -f ${config_directory}/custom.cfg ]; then
source ${config_directory}/custom.cfg
elif [ -z "${config_directory}" -a -f $prefix/custom.cfg ]; then
source $prefix/custom.cfg;
fi
### END /etc/grub.d/41_custom #### 删除/etc/fstab文件中所有以#开头的行的行首的#号及#后面的所有空白字符 # sed 's/^#[[:space:]]*//g' fstab /etc/fstab Created by anaconda on Fri Mar 4 08:36:03 2016 Accessible filesystems, by reference, are maintained under '/dev/disk' See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info UUID=ad88b2e2-0eac-45e8-80b3-742a642827d7 / xfs defaults 0 0 UUID=756954a4-022d-4da1-abe5-ed3dc587c95a /boot xfs defaults 0 0 UUID=19dba320-753d-45b3-9071-85ae514f46e0 /usr xfs defaults 0 0 UUID=67ffa57f-07e6-426f-8914-f04154a11b47 swap swap defaults 0 0
# 给定一个路径取出其路径名,即dirname # echo "/usr/bin/pwd/"|sed 's@[^/]*/\?$@@g' /usr/bin/ # 分析: 以非/开头后面至少出现一次后面跟一个/可以存在可以不存在最后锚定行尾
本文详细介绍了sed编辑器的基本概念、常用选项及其应用场景,并通过实例演示了如何利用sed进行文本处理。
1393

被折叠的 条评论
为什么被折叠?



