Linux文本处理工具三剑客之sed

Linux文本处理工具三剑客之sed


批量执行文本处理脚本,修改文件需要使用sed命令。

1. sed介绍

sedStream Editor,行编辑器,一次一行处理,通过模式空间操作文本。

2. sed用法

用法:sed [option]... 'script' inputfile...

sed默认自动打印

常用选项:

  • -n:不输出模式空间内容到屏幕,即不自动打印
  • -e:多点编辑(可以多次操作)
  • -f/PATH/SCRIPT_FILE:从指定文件中读取编辑脚本
  • -r:支持使用扩展正则表达式
  • -i.bak:备份文件并原处编辑(修改文件内容,修改前先做备份)

script

  • '地址 + 命令'

地址定界:

  1. 不给地址:对全文所有行进行处理
  2. 单地址:
    • #:指定的行,$:最后一行
    • /pattern/:被此处模式所能够匹配到的每一行,默认sed使用基本的正则表达式
  3. 地址范围:
    • #,#
    • #,+#
    • /part1/,/part2/
    • #,/part1/
  4. ~:步进
    • 1~2奇数行
    • 2~2偶数行

编辑命令:

  • p:打印当前模式空间内容,追加到默认输出(默认自动打印)之后
  • d:删除模式空间匹配的行,并立即启用下一轮循环
  • a [\]text:在指定行后面追加文本,支持使用\n实现多行追加
  • i [\]text:在指定行前面插入文本
  • c [\]text:替换行为单行或多行文本
  • w /path/somefile:保存模式匹配的行至指定文件
  • r /path/somefile:读取指定文件的文本至模式空间中匹配到的行后
  • =:为模式空间中的行打印行号
  • !:模式空间中匹配到的行取反处理

示例:

  • sed '2p /etc/passwd' 打印2次第2行
  • sed -n '2p' /etc/passwd 只打印第2行
  • 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 行后追加
  • sed '/root/i\superman' /etc/passwd 行前插入
  • sed '/root/c\superman' /etc/passwd 行替换行
  • sed '/^$/d' file 删除空行
  • sed '1,10d' file 删除第1到第10行
  • nl /etc/passwd | sed '2,5d' 输出文件内容及行号,然后删除其中第2行到第5行
  • nl /etc/passwd | sed '2a tea' 输出文件内容及行号,然后在第2行后追加内容tea
  • sed 's/test/mytest/g' example 全局替换testmytest
  • sed -n 's/root/&superman/p' /etc/passwd 查找替换rootsuperman
  • sed -n 's/root/superman&/p' /etc/passwd 查找替换supermanroot
  • sed -e 's/dog/cat' -e 's/hi/lo/' pets 多点编辑,先替换dogcat,然后替换hilo
  • sed -i.bak 's/dog/cat/g' pets 全局替换dogcat
  • sed '2,5a======' file 在文件第2到第5行之后均追加=====
  • sed '2,5a\ =====' file 文件追加空格的处理,使用\表示开始,追加包含空格开头内容
  • sed '2,5i\ =====' file 文件插入空格的处理,使用\表示开始,插入包含空格开头内容
  • sed '2,5c\ =====' file 文件中第2到第5行使用包含空格开头内容替代
  • sed '2,5w f2' file 文件f2中写入file文件中符合条件的内容
  • sed '/User/r /etc/issue' .bashrc 将文件/etc/issue中的内容读入到.bashrc文件中包含User关键字的行之后
  • sed '/aliases/aalias p=poweroff' .bashrc 在包含aliases行后追加alias p = poweroff
  • sed -i.bak '/aliases/alias p=poweroff' .bashrc 先备份后修改文件
  • sed -i.bak "/aliases/aalias cdnet='cd /etc/sysconfig/network-scripts'" .bashrc 空格处理,单双引号的使用

nl命令在Linux系统中用于输出文件中的行号,nl命令在输出的文件内容前自动加上行号。

nl -b a -n rz 命令行号默认为六位,要调整位数可以加上参数 -w 3 调整为3位。

3. sed高级用法

  • s///查找替换,分隔符可自行指定,支持使用其他分隔符,s@@@s###
  • 替换标记:
    • g:行内全局替换
    • p:显示替换成功的行
    • w /path/to/somefile:将替换成功的行保存至文件中
  • 内容引用&:引用前面搜索到的整个内容
  • 向后引用/()//,引用分组:s/\(love)able/\1r/lovable替换为:lover

实例:

  • sed -r 's/(.*)/mageedu\1/' /etc/passwd

  • sed -r 's@/bin/bash$@/sbin/bash@' /etc/passwd等效于:sed -r 's@(/bin/bash)@/s\1@'

  • sed -r '/GRUB_CMDLINE_LINUX/s/(.*)"$/\1 xyz/' /etc/default/grub等效于:

  • sed -r '/GRUB_CMDLINE_LINUX/s/"$/ xyz"/' /etc/default/grub等效于:

  • sed -r 's/(GRUB_CMDLINE_LINUX.*)"$/\1 xyz/' /etc/default/grub

练习:

  1. 查询本地IP:只打印本机IP,查找替换只剩下本地IP

    ifconfig enp0s5 | sed -n '2p' | sed -r 's/.*inet (.*) net.*/\1/'等效于:

    ifconfig enp0s5 | sed -n '2p' | sed -r 's/(.*inet )(.*)( net.*)/\2/'等效于:

    ifconfig enp0s5 | sed -r '2!d;s/(.*inet )(.*)( net.*)/\2/'等效于:

    ifconfig enp0s5 | sed -n '2p' | sed -r 's/.*inet //' | sed -r 's/ net.*//'

    ifconfig enp0s5 | sed -n '2p' | sed -e 's/.*inet //' -e 's/ net.*//'

  2. 取消/etc/httpd/conf/httpd.conf文件注释

    NameVirtualHostVirtualHost行的注释#

    #NameVirtualHost *:80
    
    #<VirtualHost *:80>
    #	ServerAdmin webmaster@dummy-host.example.com
    #	DocumentRoot /www/docs/dummy-host.example.com
    #	ServerName dummy-host.example.com
    #	ErrorLog logs/dummy-host.example.com-error_log
    #	CustomLog logs/dummy-host.example.com-access_log
    #</VirtualHost>
    

    sed '/^#NameVirtualHost/s/#//' httpd.conf | sed '/#<VirtualHost/,/#<\/VirtualHost>/s/#//' httpd.conf

    等效于:

    sed -e '/^#NameVirtualHost/s/#//' httpd.conf -e '/#<VirtualHost/,/#<\/VirtualHost>/s/#//' httpd.conf

  3. 查看文件的基名与文件名

    echo "/etc/sysconfig/network/" | sed -r 's/(.*\/)([^\/]+\/?$)/\1/'

    echo "/etc/sysconfig/network/" | sed -r 's/(.*\/)([^\/]+\/?$)/\2/'

    实例中sed命令的操作步骤:

    1. 定位
    2. 替换

4. 参考链接

  1. shell编程值sed

  2. sed高级用法及企业级实战

  3. nl命令

posted @ 2021-03-15 17:57  LinPerfei  阅读(58)  评论(0)    收藏  举报