Linux文本处理三剑客之sed

本文发布时间: 2019-Mar-22
一、什么是sed sed(Stream EDitor)流编辑器,是一个非交互式的文本编辑器,它可以对文本文件和标准输入进行编辑,标准输入可以来自键盘输入、文件重定向、字符串、变量等。sed从文本的一个文本行或者标准输入中读取数据,将其复制到缓冲区,然后读取命令行或脚本的第一个命令,对此要求的行号进行编辑,重复此过程,直到命令行或者脚本中的所有命令都执行完毕。 sed适用于以下三种场景:编辑相对交互式文本编辑器而言太大的文件。编辑命令太傅在,在交互式文本编辑器中难以输入的情况对文件扫描一遍,但是需要执行多个编辑函数的情况二、sed命令组成部分命令格式:sed [OPTION]... 'script' [input-file] ...[OPTION]:sed 命令选项script:sed脚本,由“地指定界编与辑命令组成”(注意此处地址定界与编辑命令中间没有任何符号)三、sed命令常用选项及脚本详解sed选项: -n:不输入模式空间中的内容至屏幕# sed '/^#/d' fstabUUID=ad88b2e2-0eac-45e8-80b3-742a642827d7 / xfs defaults 0 0UUID=756954a4-022d-4da1-abe5-ed3dc587c95a /boot xfs defaults 0 0UUID=19dba320-753d-45b3-9071-85ae514f46e0 /usr xfs defaults 0 0UUID=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 0UUID=756954a4-022d-4da1-abe5-ed3dc587c95a /boot xfs defaults 0 0UUID=19dba320-753d-45b3-9071-85ae514f46e0 /usr xfs defaults 0 0UUID=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' fstabUUID=ad88b2e2-0eac-45e8-80b3-742a642827d7 / xfs defaults 0 0UUID=756954a4-022d-4da1-abe5-ed3dc587c95a /boot xfs defaults 0 0UUID=19dba320-753d-45b3-9071-85ae514f46e0 /usr xfs defaults 0 0UUID=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/fstabUUID=ad88b2e2-0eac-45e8-80b3-742a642827d7 / xfs defaults 0 0UUID=756954a4-022d-4da1-abe5-ed3dc587c95a /boot xfs defaults 0 0UUID=19dba320-753d-45b3-9071-85ae514f46e0 /usr xfs defaults 0 0UUID=67ffa57f-07e6-426f-8914-f04154a11b47 swap swap defaults 0 0 -i:直接编辑原文件(慎用)# cp fstab fstab.bak# sed -f sed_script -i fstab# cat fstabUUID=ad88b2e2-0eac-45e8-80b3-742a642827d7 / xfs defaults 0 0UUID=756954a4-022d-4da1-abe5-ed3dc587c95a /boot xfs defaults 0 0UUID=19dba320-753d-45b3-9071-85ae514f46e0 /usr xfs defaults 0 0UUID=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 0UUID=756954a4-022d-4da1-abe5-ed3dc587c95a /boot xfs defaults 0 0UUID=19dba320-753d-45b3-9071-85ae514f46e0 /usr xfs defaults 0 0UUID=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 0UUID=756954a4-022d-4da1-abe5-ed3dc587c95a /boot xfs defaults 0 0UUID=19dba320-753d-45b3-9071-85ae514f46e0 /usr xfs defaults 0 0UUID=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 0UUID=756954a4-022d-4da1-abe5-ed3dc587c95a /boot xfs defaults 0 0UUID=19dba320-753d-45b3-9071-85ae514f46e0 /usr xfs defaults 0 0UUID=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 0UUID=756954a4-022d-4da1-abe5-ed3dc587c95a /boot xfs defaults 0 0UUID=19dba320-753d-45b3-9071-85ae514f46e0 /usr xfs defaults 0 0UUID=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 0UUID=756954a4-022d-4da1-abe5-ed3dc587c95a /boot xfs defaults 0 0UUID=19dba320-753d-45b3-9071-85ae514f46e0 /usr xfs defaults 0 0UUID=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 0UUID=756954a4-022d-4da1-abe5-ed3dc587c95a /boot xfs defaults 0 0UUID=19dba320-753d-45b3-9071-85ae514f46e0 /usr xfs defaults 0 0UUID=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 0UUID=756954a4-022d-4da1-abe5-ed3dc587c95a /boot xfs defaults 0 0UUID=19dba320-753d-45b3-9071-85ae514f46e0 /usr xfs defaults 0 0UUID=67ffa57f-07e6-426f-8914-f04154a11b47 swap swap defaults 0 0 $:最后一行# sed -n '$p' fstabUUID=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 0UUID=756954a4-022d-4da1-abe5-ed3dc587c95a /boot xfs defaults 0 0UUID=19dba320-753d-45b3-9071-85ae514f46e0 /usr xfs defaults 0 0UUID=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 infoUUID=ad88b2e2-0eac-45e8-80b3-742a642827d7 / xfs defaults 0 0UUID=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 0UUID=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 0UUID=756954a4-022d-4da1-abe5-ed3dc587c95a /boot xfs defaults 0 0UUID=19dba320-753d-45b3-9071-85ae514f46e0 /usr xfs defaults 0 0UUID=67ffa57f-07e6-426f-8914-f04154a11b47 swap swap defaults 0 0编辑命令: d:删除被模式匹配到的行 p:显示模式空间中的内容 a ext:在行后面追加文本“text”,支持使用 实现多行追加# sed '/^#/a ew line' fstab#new line# /etc/fstabnew line# Created by anaconda on Fri Mar 4 08:36:03 2016new 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 infonew line#new lineUUID=ad88b2e2-0eac-45e8-80b3-742a642827d7 / xfs defaults 0 0UUID=756954a4-022d-4da1-abe5-ed3dc587c95a /boot xfs defaults 0 0UUID=19dba320-753d-45b3-9071-85ae514f46e0 /usr xfs defaults 0 0UUID=67ffa57f-07e6-426f-8914-f04154a11b47 swap swap defaults 0 0 i ext:在行前面插入文本“text”,支持使用 实现多行插入# sed '/^#/i ew line' fstabnew line#new line# /etc/fstabnew line# Created by anaconda on Fri Mar 4 08:36:03 2016new 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 infonew line#UUID=ad88b2e2-0eac-45e8-80b3-742a642827d7 / xfs defaults 0 0UUID=756954a4-022d-4da1-abe5-ed3dc587c95a /boot xfs defaults 0 0UUID=19dba320-753d-45b3-9071-85ae514f46e0 /usr xfs defaults 0 0UUID=67ffa57f-07e6-426f-8914-f04154a11b47 swap swap defaults 0 0 c ext:把匹配到的行替换为此处指定的文本“text”# sed '/^#/c ew line' fstabnew linenew linenew linenew linenew linenew linenew lineUUID=ad88b2e2-0eac-45e8-80b3-742a642827d7 / xfs defaults 0 0UUID=756954a4-022d-4da1-abe5-ed3dc587c95a /boot xfs defaults 0 0UUID=19dba320-753d-45b3-9071-85ae514f46e0 /usr xfs defaults 0 0UUID=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 0UUID=756954a4-022d-4da1-abe5-ed3dc587c95a /boot xfs defaults 0 0UUID=19dba320-753d-45b3-9071-85ae514f46e0 /usr xfs defaults 0 0UUID=67ffa57f-07e6-426f-8914-f04154a11b47 swap swap defaults 0 0 =:为模式匹配到的行打印行号# sed '/^#/=' fstab2#3# /etc/fstab4# Created by anaconda on Fri Mar 4 08:36:03 20165#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 info8#UUID=ad88b2e2-0eac-45e8-80b3-742a642827d7 / xfs defaults 0 0UUID=756954a4-022d-4da1-abe5-ed3dc587c95a /boot xfs defaults 0 0UUID=19dba320-753d-45b3-9071-85ae514f46e0 /usr xfs defaults 0 0UUID=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' fstabUUID=ad88b2e2-0eac-45e8-80b3-742a642827d7 / xfs defaults 0 0UUID=756954a4-022d-4da1-abe5-ed3dc587c95a /boot xfs defaults 0 0UUID=19dba320-753d-45b3-9071-85ae514f46e0 /usr xfs defaults 0 0UUID=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=1if [ -s $prefix/grubenv ]; thenload_envfiif [ "${next_entry}" ] ; thenset default="${next_entry}"set next_entry=save_env next_entryset boot_once=trueelseset default="${saved_entry}"fiif [ x"${feature_menuentry_id}" = xy ]; thenmenuentry_id_option="--id"elsemenuentry_id_option=""fiexport menuentry_id_optionif [ "${prev_saved_entry}" ]; thenset saved_entry="${prev_saved_entry}"save_env saved_entryset prev_saved_entry=save_env prev_saved_entryset boot_once=truefifunction savedefault {if [ -z "${boot_once}" ]; thensaved_entry="${chosen}"save_env saved_entryfi}function load_video {if [ x$feature_all_video_module = xy ]; theninsmod all_videoelseinsmod efi_gopinsmod efi_ugainsmod ieee1275_fbinsmod vbeinsmod vgainsmod video_bochsinsmod video_cirrusfi}terminal_output consoleif [ x$feature_timeout_style = xy ] ; thenset timeout_style=menuset timeout=5# Fallback normal timeout code in case the timeout_style feature is# unavailable.elseset timeout=5fi### 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 ]; thensource ${prefix}/user.cfgif [ -n ${GRUB2_PASSWORD} ]; thenset superusers="root"export superuserspassword_pbkdf2 root ${GRUB2_PASSWORD}fifi### 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_videoset gfxpayload=keepinsmod gzioinsmod part_msdosinsmod xfsset root='hd0,msdos1'if [ x$feature_platform_search_hint = xy ]; thensearch --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-ed3dc587c95aelsesearch --no-floppy --fs-uuid --set=root 756954a4-022d-4da1-abe5-ed3dc587c95afilinux16 /vmlinuz-3.10.0-327.el7.x86_64 root=UUID=ad88b2e2-0eac-45e8-80b3-742a642827d7 ro rhgb quiet LANG=en_US.UTF-8initrd16 /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_videoinsmod gzioinsmod part_msdosinsmod xfsset root='hd0,msdos1'if [ x$feature_platform_search_hint = xy ]; thensearch --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-ed3dc587c95aelsesearch --no-floppy --fs-uuid --set=root 756954a4-022d-4da1-abe5-ed3dc587c95afilinux16 /vmlinuz-0-rescue-94b3ec34f75d44df93cc011c79159864 root=UUID=ad88b2e2-0eac-45e8-80b3-742a642827d7 ro rhgb quietinitrd16 /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 ]; thensource ${config_directory}/custom.cfgelif [ -z "${config_directory}" -a -f $prefix/custom.cfg ]; thensource $prefix/custom.cfg;fi### END /etc/grub.d/41_custom #### 删除/etc/fstab文件中所有以#开头的行的行首的#号及#后面的所有空白字符# sed 's/^#[[:space:]]*//g' fstab/etc/fstabCreated by anaconda on Fri Mar 4 08:36:03 2016Accessible filesystems, by reference, are maintained under '/dev/disk'See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more infoUUID=ad88b2e2-0eac-45e8-80b3-742a642827d7 / xfs defaults 0 0UUID=756954a4-022d-4da1-abe5-ed3dc587c95a /boot xfs defaults 0 0UUID=19dba320-753d-45b3-9071-85ae514f46e0 /usr xfs defaults 0 0UUID=67ffa57f-07e6-426f-8914-f04154a11b47 swap swap defaults 0 0# 给定一个路径取出其路径名,即dirname# echo "/usr/bin/pwd/"|sed 's@[^/]*/?$@@g'/usr/bin/# 分析: 以非/开头后面至少出现一次后面跟一个/可以存在可以不存在最后锚定行尾


(以上内容不代表本站观点。)
---------------------------------
本网站以及域名有仲裁协议。
本網站以及域名有仲裁協議。

2024-Mar-04 02:09pm
栏目列表