Linux文本处理工具三剑客之sed
Linux文本处理工具三剑客之sed
批量执行文本处理脚本,修改文件需要使用sed命令。
1. sed介绍
sed:Stream Editor,行编辑器,一次一行处理,通过模式空间操作文本。
2. sed用法
用法:sed [option]... 'script' inputfile...
sed默认自动打印
常用选项:
-n:不输出模式空间内容到屏幕,即不自动打印-e:多点编辑(可以多次操作)-f:/PATH/SCRIPT_FILE:从指定文件中读取编辑脚本-r:支持使用扩展正则表达式-i.bak:备份文件并原处编辑(修改文件内容,修改前先做备份)
script:
'地址 + 命令'
地址定界:
- 不给地址:对全文所有行进行处理
- 单地址:
#:指定的行,$:最后一行/pattern/:被此处模式所能够匹配到的每一行,默认sed使用基本的正则表达式
- 地址范围:
#,##,+#/part1/,/part2/#,/part1/
~:步进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行后追加内容teased 's/test/mytest/g' example全局替换test为mytestsed -n 's/root/&superman/p' /etc/passwd查找替换rootsupermansed -n 's/root/superman&/p' /etc/passwd查找替换supermanrootsed -e 's/dog/cat' -e 's/hi/lo/' pets多点编辑,先替换dog为cat,然后替换hi为losed -i.bak 's/dog/cat/g' pets全局替换dog为catsed '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 = poweroffsed -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
练习:
-
查询本地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.*//' -
取消
/etc/httpd/conf/httpd.conf文件注释NameVirtualHost和VirtualHost行的注释##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 -
查看文件的基名与文件名
echo "/etc/sysconfig/network/" | sed -r 's/(.*\/)([^\/]+\/?$)/\1/'echo "/etc/sysconfig/network/" | sed -r 's/(.*\/)([^\/]+\/?$)/\2/'实例中
sed命令的操作步骤:- 定位
- 替换

浙公网安备 33010602011771号