目录
文件内容修改操作—替换,将一行中匹配的内容替换为新的数据,使用命令c
非交互式编辑器,一次处理一行内容。(流文本编辑器)
?sed [options] '{command}[flags]' [filename] ? ? ?# 中括号内容必有 大括号内容可有可无 ?sed # 执行命令 ?[options] # 命令选项 ?{command}[flags] ? # sed内部选项和参数 ?[filename] ? ? # 文件
?命令选项 ?-e script 将脚本中指定的命令添加到处理输入时执行的命令中, 多条件,一行中要有多个操作 ?-f script 将文件中指定的命令添加到处理输入时执行的命令中 ?-n ? ? ? 抑制自动输出 ?-i ? ? ? 编辑文件内容 ?-i.bak ? 修改时同时创建.bak备份文件。 ?-r ? ? ? 使用扩展的正则表达式 ?! ? ? ? ? 取反 (跟在模式条件后与shell有所区别) ?? ?sed常用内部命令 ?a ? 在匹配后面添加 ?i ? 在匹配前面添加 ?p ? 打印 ?d ? 删除 ?s ? 查找替换 ?c ? 更改 ?y ? 转换 ? N D P ?? ?flags ?数字 ? ? ? ? ? ? 表示新文本替换的模式 ?g: ? ? ? ? ? ? 表示用新文本替换现有文本的全部实例 ?p: ? ? ? ? ? ? 表示打印原始的内容 ?w filename: ? ? 将替换的结果写入文件 ??
?#在第三行和第六行后新开一行添加nihao world ?sed -i -e '3a\nihao world' -e '6a\nihao world' file ?#在第三行到第六行后新开一行添加nihao world ?sed -i '3,6a\nihao world' file ?#在第三行到第六行之前插入nihao world ?sed -i '3,6i\nihao world' file ?#在第三行和第六行末尾添加nihao world ?sed -i '3,6s/$/nihao world/' file
?#取消file文件里“#nihao world”的注释 ?sed -i "/^#nihao world/s/^#//" file ?#为file文件里“nihao world”添加注释 ?sed -i "/nihao world/s/^/#/" ? file
?追加 ?#找到“5 root”的行,在其后新开一行追加“nihao world” ?sed -i '/5 root/a\nihao world' file ?? ?插入 ?#找到“5 root”的行,在其前新开一行插入“nihao world” ?sed -i '/5 root/i\nihao world' file
?语法 sed -i 's/新内容/旧内容/g' file ?#匹配行整行的替换 ?将1到3行的内容替换为nihao world ?sed -i '1,3c'\nihao world file ?#匹配字符串所在行整行的替换 ?将file文件中包含“sbin”的行的内容替换为“nihao world” ?sed -i '/sbin/c\nihao world' file
?#删除file文件中的第4到第7行 ?sed -i '4,7d' file ?#删除file文件中的root ?sed -i /root/d file
?#打印file的内容 ?sed -n 'p' file ?#打印file文件里的4到6行 ?sed -n '4,6p' file ?#打印file文件里的第4行与第7行 ?sed -n '4p;7p' file ?#打印file文件包含root的行 ?sed -n /root/p file
?打印file中以字符串"3 the"开头的行内容 ?sed -n -r /^(3 the)/p file
说明:在正则表达式中如果出现特殊字符(^$.*/[]),需要以前导 “\” 号做转义
?统计file有多少行 ?[root@jiangnan ~]# sed -n '$=' file ?打印file内容时加上行号 ?[root@jiangnan ~]# sed '=' file
?输出包含the的所在行的行号(= 用来输出行号) ?[root@jiangnan ~]# sed -n '/the/=' test.txt ?? ?输出以PI开头的行 ?[root@jiangnan ~]# sed -n '/^PI/p' test.txt ?? ?输出以数字结尾的行 ?[root@jiangnan ~]# sed -n '/[0-9]$/p' test.txt ?? ?输出包含单词wood的行 \< ,\>表示单词边界 ?[root@jiangnan ~]# sed -n '/\<wood\>/p' test.txt ?a wood cross! ?? ?每行开始添加#字符 ?[root@jiangnan ~]# sed 's/^/#/' test.txt ?? ?在包含the的每行行首添加#字符 ?[root@jiangnan ~]# sed '/the/s/^/#/' test.txt ?? ?在每行末尾添加EOF字符 ?[root@jiangnan ~]# sed 's/$/EOF/' test.txt ?? ?将3-5行所有的the替换为THE ?[root@jiangnan ~]# sed '3,5s/the/THE/g' test.txt ?? ?将包含the的行中的o替换为O ?[root@jiangnan ~]# sed '/the/s/o/O/g' test.txt ?? ?迁移符合条件的文本 ?H 复制到剪贴板; ?g,G 将剪贴板中的数据覆盖/追加到指定行; ?w保存为文件; ?r读取指定文件; ?a 追加指定内容 ?? ?将包含the的行迁移到行尾(;用于多个操作) ?? ?H复制到剪贴板---d删除---$G追加到行尾 ?[root@jiangnan ~]# sed '/the/{H;d};$G' test.txt ?? ?将1-5行迁移到17行后 ?[root@jiangnan ~]# sed '1,5{H;d};17G' test.txt ?? ?将包含the的行另存为新文件 ?[root@jiangnan ~]# sed '/the/w out.file' test.txt ?? ?[root@jiangnan ~]# ls ?? ?anaconda-ks.cfg out.file test.txt ?:wq ?? ?[root@jiangnan ~]# cat out.file ?? ?在包含the每行后添加文件hostname内容 ?[root@jiangnan ~]# sed '/the/r /etc/hostname' test.txt ?? ?在第3行后插入新行,内容为New ?[root@jiangnan ~]# sed '3aNew' test.txt ?? ?在包含the的每行后插入新行 ?[root@jiangnan ~]# sed '/the/aNew' test.txt ?? ?在第3行后插入多行(\n 换行符) ?[root@jiangnan ~]# sed '3aNew1\nNew2' test.txt ?ngnan ~]# sed '1,5{H;d};17G' test.txt ?? ?将包含the的行另存为新文件 ?[root@jiangnan ~]# sed '/the/w out.file' test.txt ?? ?[root@jiangnan ~]# ls ?? ?anaconda-ks.cfg out.file test.txt ?:wq ?? ?[root@jiangnan ~]# cat out.file ?? ?在包含the每行后添加文件hostname内容 ?[root@jiangnan ~]# sed '/the/r /etc/hostname' test.txt ?? ?在第3行后插入新行,内容为New ?[root@jiangnan ~]# sed '3aNew' test.txt ?? ?在包含the的每行后插入新行 ?[root@jiangnan ~]# sed '/the/aNew' test.txt ?? ?在第3行后插入多行(\n 换行符) ?[root@jiangnan ~]# sed '3aNew1\nNew2' test.txt