一、sed命令
1.1 概述
文本三剑客之二:sed
sed是一种流编辑器,按行处理,一次处理一行内容。
操作结果如果只是展示,会放在缓冲区(模式空间),展示结束之后,会从模式空间把操作结果删除。
处理文本时按行处理,处理完当前行,才会处理下一行,直到文件末尾。
1.2 sed命令
格式1:
sed -e '操作符1' -e '操作符2' 文件1 文件2
-e :表示可以跟多个操作符,如果只有一个操作,-e可以省略。
格式2:
sed -e '操作符1;操作符2' 文件1 文件2
选项:
-e :用于执行多个操作命令
-f :在脚本中定义好了操作符,然后根据脚本内容的操作对文本进行操作
-i :直接修改目标文件(慎用)
-n :仅显示script处理后的结果(不加-n,sed会显示两个输出结果,加了-n,会把默认输出屏蔽)
-r :使用扩展正则表达式
操作符:
p :打印结果
s :替换,替换字符串
c :替换,替换指定行
y :替换,替换单个字符,多个字符替换必须和替换内容的字符长度保持一致,等量替换
d :删除,删除行
a :插入,在指定行的下一行插入内容
i :插入,在指定行的上一行插入内容
二、sed的常用用法
2.1 寻址打印
寻址打印:按照指定行来打印(以下都省略要操作文件,只写操作符)
sed -n '=' #只显示行号
sed -n '=;p' #显示行号和内容(行号和内容分行显示)
sed -n '4p' #打印第四行
sed -n '$p' #打印最后一行
sed -n '2,4p' #打印第2行到第4行
sed -n '2p;$p' #打印第2行和最后一行
sed -n 'p;n' #打印奇数行
sed -n 'n;p' #打印偶数行,引号中的n表示跳过一行,打印下一行
2.2 过滤文本
对文本内容进行过滤
sed -n '/o/p' #过滤并打印包含o的行,使用//进行匹配
使用正则表达式对文本内容进行过滤
sed -n '/^root/p' #过滤并打印以root开头的行
sed -n '3,/bash$/p' #从第三行开始打印,直到打印出第一个以bash结尾的行为止
使用扩展正则:
例:打印/etc/passwd要么以root开头要么以bash结尾的行
sed -rn '/^root|bash$/p' /etc/passwd
2.3 删除文本
sed的删除操作
sed -n '3d;p' #删除指定的行,删除第3行,打印剩余的行
sed -n '5,$d;p' #删除第5行到最后一行,打印剩余的行
sed -n '1!d;p' #除了第1行,其他行全部删除,打印剩余的行
sed -n '4,6!d;p' #除了4-6行,其他行全部删除,打印剩余的行
匹配字符串来删除行
sed '/o/d' #删除包含o的行
sed '/one/,/six/d' #删除包含one的行到包含six的行
2.4 替换文本
匹配字符串替换
sed 's/a/b/p' filename #把文件中每行的第一个a换成b,并打印输出
sed 's/a/b/2p' filename #把文件中每行的第二个a换成b,并打印输出
sed 's/a/b/gp' filename #把文件中每行的所有a换成b,并打印输出
sed 's/^/#/p' filename #注释文件的每一行
sed '4s/^/#/p' filename #注释文件的第4行
sed '4-6s/^/#/p' filename #注释文件的第4到6行
首字母变成大写
sed 's/[a-z]/\u&/' filename #转换首字母为大写
\u :转换下个字母为大写,\为转义符
\U :转换后面所有字母为大写,直到\L或\E为止
\l :转换下个字母为小写,\为转义符
\L :转换后面所有字母为小写,直到\U或\E为止
\E :结束大小写转换
& :&在sed中代指前面匹配到的内容
sed 's/[a-z]/\u&/g' filename #转换全部小写字母为大写
sed 's/[A-Z]/\l&/g' filename #转换全部大写字母为小写
整行替换
sed '/整行内容/c 要替换的内容' filename #整行内容替换
单字符替换
sed 'y/one/123/' filename
注:单字符替换不是字符串替换,上一句的含义是把文件中所有的o换成1,n换成2,e换成3
去掉文件dhcpd.conf中#ddns-开头的行的#号
sed -r 's/#(ddns.+)/\1/' dhcpd.conf
去掉所有被注释行开头的#号
sed -r 's/#(.+)/\1' filename
把文件中所有单词的首字母设为大写
sed -r 's/\b[/S]/\u&' filename
2.5 插入文本
sed '/目标行内容/a 插入的内容' file #在file的目标行下行插入内容
sed '/目标行内容/i 插入的内容' file #在目标行上行插入内容
sed '/目标行内容/r 插入的文件' file #在目标行下行插入文件的内容
sed '$a 插入的内容' file #在最后一行下行插入内容
sed '$i 插入的内容' file #在最后一行上行插入内容(倒数第二行)
sed '$r 插入的文件' file #在最后一行下行插入文件的内容
2.6 文本互换位置
使用sed对字符串和字符的位置进行互换
echo aabbcc | sed -r 's/(aa)(bb)(cc)/\3\1\2/'
ccaabb
用分组的方式对字符串进行互换,分组的默认序号按从左到右为1 2 3 ,在//指定匹配内容时对内容分组,在后面用\分组序号的形式指定分组的位置。
echo 你真的帅啊 | sed -r 's/(.)(.)(.)(.)(.)/\2\3\4\5\1/'
真的帅啊你