一、什麼是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/ # 分析: 以非/開頭後面至少出現一次後面跟一個/可以存在可以不存在最後錨定行尾