linux三剑客之一,一种非交互式的流编辑器,可直接修改源文件
参数
-e 可以指定多个命令
-f 指定命令文件
-n 取消默认控制台输出,与p一起使用可打印指定内容
-i 输出到原文件,静默执行(修改原文件的意思)
command
a 新增
c 替换,整行
d 删除
i 插入
p 打印,要和-n参数一起使用
s 替换(匹配局部替换)
sed 's/pattern/replacement/flags'
flags标记功能
n 表示1-512之间的数字,表示指定替换的字符串出现的第几个位置
g 对所有匹配到的内容进行替换,没有则默认只替换第一个
p 打印匹配的行,与-n结合使用
w 将缓冲区的内容写到指定文件中
& 用正则表达式匹配的内容进行替换
= 打印行号
y 字符按照一对一的方式从左到右进行转换
r 扩展匹配,默认只支持基本正则表达式,将独立的文件内容插入到当前内容指定位置
h 拷贝模板块的内容到内存中的缓冲区。
H 追加模板块的内容到内存中的缓冲区。
g 获得内存缓冲区的内容,并替代当前模板块中的文本。
G 获得内存缓冲区的内容,并追加到当前模板块文本的后面。
x 交换模式空间与保持空间的内容
通配符
^ 行首定位符 /^my/ 匹配所有以my开头的行
$ 行尾定位符 /my$/ 匹配所有以my结尾的行
. 匹配除换行符以外的单个字符 /m..y/ 匹配包含字母m,后跟两个任意字符,再跟字母y的行
* 匹配零个或多个前导字符 /my*/ 匹配包含字母m,后跟零个或多个y字母的行
[] 匹配指定字符组内的任一字符 /[Mm]y/ 匹配包含My或my的行
[^] 匹配不在指定字符组内的任一字符 /[^Mm]y/ 匹配包含y,但y之前的那个字符不是M或m的行
& 保存查找串以便在替换串中引用 s/my/**&**/ 符号&代表查找串。my将被替换为**my**
\< 词首定位符 /\<my/ 匹配包含以my开头的单词的行
\> 词尾定位符 /my\>/ 匹配包含以my结尾的单词的行
x\{m\} 连续m个x /9\{5\}/ 匹配包含连续5个9的行
x\{m,\} 至少m个x /9\{5,\}/ 匹配包含至少连续5个9的行
x\{m,n\} 至少m个,但不超过n个x /9\{5,7\}/ 匹配包含连续5到7个9的行
POSIX字符类
[[:upper:]] 表示大写字母[A-Z]
[[:lower:]] 表示小写字母[a-z]
[[:digit:]] 表示阿拉伯数字[0-9]
[[:alnum:]] 大小写字母和数字[0-9a-zA-Z]
[[:space:]] 表示空格或Tab键
[[:alpha:]] 大小写字母[a-zA-Z]
[[:cntrl:]] 表示ctrl键
[[:graph:]]或[:print:] ASCII中33-126之间的字符
[[:xdigit:]] 16进制数字
[[:punct:]] 匹配标点符号
[[:blank:]] 匹配空格或制表符
增加a、i、r
指定位置行前a
sed '2a newline' test.txt #在第二行后面增加一行内容
sed '1,3a newline' test.txt #在1到3行每行后面增加一行内容
sed '1,+4a 新行字符串' test.txt #从第一行开始向下4行进行追加
sed '1~2a 新行字符串' test.txt #从第一行开始开始向下+2行进行追加
指定位置行后i
sed '2i testContent' test.txt #在第 2 行前面插入一行内容
sed '1,3i testContent' test.txt #在原文的第 1~3 行前面各插入一行内容
sed '3r data.txt' test.txt #将data.txt文件内容插入test.txt内容中的第3行后
sed -i '/指定字符串/a 新行字符串' test.txt #指定字符串行后插入新行
替换c、s、y、w
sed '2c testContent' test.txt #将第 2 行内容整行替换
sed '1,3c testContent' test.txt #将第 1~3 行内容替换成一行指定内容
sed 's/old/new/' test.txt #匹配每一行的第一个old替换为new
sed 's#old#new#' test.txt
#分隔符默认为正斜杠,无论什么字符(换行符、反斜线除外),只要紧跟s命令,就成了新的串分隔符。
sed '2s/old/new/' test.txt #替换指定第二行的匹配内容,只换第一处
sed 's/old/new/1' test.txt #替换第一个匹配的位置
sed 's/.//2;s/.$//' test.txt #删除文件中每行第二个和最后一个字符
sed '/key/s//old/new/' test.txt #先匹配关键字符串行,再替换匹配内容
sed 's/old/new/gi' test.txt #匹配所有old替换为new,g 代表一行多个,i 代表匹配忽略大小写
sed '3,9s/old/new/gi' test.txt #匹配第 3~9 行所有old替换为new
sed -n '2,3s{/cn/china/;/ou/ye/}' test.txt #将第2行到第3行之间匹配的进行替换,相当于执行多条命令
sed '/key/ {s/[0-9]+/356/g}' test.txt #将匹配行的数字进行替换
echo "this is a test line" | sed 's/\w+/[&]/g' #正则匹配,&对应于之前所匹配到的单词
sed '1,20y/abc/ABC/' test.txt #单独处理单个字符,对应替换
sed 's/old/new/w new.txt' test.txt #将匹配后的内容保存在new.txt文件中
删除d
sed '2d' test.txt #删除第 2 行
sed '1,3d' test.txt #删除第1~3行
sed '/1/,/3/d' test.txt #删除1~3行
sed '5,$d' test.txt #删除从第5行开始到结束的行
sed '/My/,/You/d' test.txt #删除包含'My'到'You'的行
sed '3d;4d;7d' #删除3、4、7行,多个条件用;隔开
sed 'd' test.txt #删除所有行
sed '/^$/d' test.txt #删除空行
打印p、n
sed '2p' test.txt #重复打印第 2
sed '1,2=' test.txt #将行号打印出来
sed '1,3p' test.txt #重复打印第1~3行
sed -n '2p' test.txt #只打印第 2 行
sed -n '1,3p' test.txt #只打印第 1~3 行
sed -n '/user/p' test.txt #打印匹配到user的行,类似grep
sed -n '/user/!p' test.txt #! 反选,打印没有匹配到user的行
sed -n 's/old/new/gp' test.txt #只打印匹配替换的行
sed -n '/^a/p;/^b/p' test.txt #打印以a开头和以b开头的行
sed -n 'n;p' test.txt #打印偶数行,或者"2~2p"
sed -n 'p;n' test.txt #打印奇数行,或者"1~2p"
sed -n '$=' test.txt #输出文件的总行数,同wc -l(会输出文件名)
参数-e
sed -e 's/88/66/g' -e '2d' test.txt #执行多个指令
参数-f
sed -f ab.log test.txt #多个命令写进ab.log文件里,一行一条命令,效果同-e
综合
sed -r 's/^(.)(.)(.*)/\2\1\3/' test.txt #将文件中每行的第一个、第二个字符互换
sed -r 's/[0-9]//g;s/^( )+//' test.txt #删除所有数字和行首空格
sed 's/[A-Z]/(&)/g' test.txt #为文件中每个大写字母添加括号,&表示前面匹配的字符串内容
sed -r "s/([A-Z])/(\1)/g" test.txt #同上
echo "/etc/sysconfig/network/" | sed -r 's/(.*\/)([^/]+\/?$)/\2/' #提取后面目录
ls /Packages | sed -r 's/(.*\.)([^.]+)(\.rpm$)/\2/' | sort | uniq -c #统计rpm包个数
复制剪切,复制(H追加,h覆盖)、粘贴(G追加,g覆盖)
sed 'G' test.txt #在每行后面都插入空白行
sed '$!G' test.txt #末行不加空白行
sed '1,3H;$G' test.txt #将1-3行复制到文件末尾
sed '1h;2,3H;$G' test.txt #可避免出现空行(出现空行的原因是保持空间内默认已有一个空行)
sed '2H;4G' test.txt #把第2行复制第4行,追加出现空行
sed '2h;4G' test.txt #不要空行
sed '1h,1d;$G' test.txt #把第1行剪切到文件末尾
sed '1h;2H;1,2d;$G' test.txt #把第1-2行剪切到文件末尾
sed '22h;23,33H;56G' test.txt #把文件从第22行到第33行复制到56行后面
sed '22{h;d};23,33{H;d};56g' test.txt #把文件从第22行到第33行移动到第56行后面