目录
sed介绍
一、祖传搭配
二、语法参数
1.语法
第一部分 [-nhV]
第二部分 命令脚本
第三部分 文本
脚本动作说明
2.动作样例
3. 命令组合
3.修改文件
三、总结
sed介绍
脚本来处理文本文件
主要用来自动编辑一个或多个文件、简化对文件的反复操作、批量处理
一、祖传搭配
这里先列举出常用的搭配,用熟了后可以不过脑子直接写出
全文替换
sed -i "s/要被取代的字串/新的字串/g" file匹配行后替换
sed -i "/匹配模式/要被取代的字串/新的字串/" file匹配行后执行多条动作
sed -i "/匹配模式/{s/old/new/;${action1};${action2}" file批量生成固定模式xml
for i in `seq 1001 1012`; do sed -e "s/1000/$i/" 1000.xml > $i.xml; done
二、语法参数
1.语法
sed [-irhV]
[-e<script>][-f<script文件>]
[-i 文本文件][文本文件]
语法解析
我们按行区分,每行都有代表的意思,详解如下:
第一部分 [-nhV]
常规参数,参数自解释不用带value
- -i --in-place 直接对文件就地修改
- -n --quiet或--silent 仅显示script处理后的结果
- -r --regexp-extended 扩展正则方式
- -h --help 显示帮助
- -V --version 显示版本信息
第二部分 命令脚本
-e 后接 命令脚本,加不加这个参数都可
-f 如果匹配模式比较复杂,可以写到文件里,sed命令会将其展开。这个参数和 grep、awk含义相同
第三部分 文本
最后也就是我们的待匹配的文本文件了
脚本动作说明
- a :新增, a 的后面可以接字串,而这些字串会在新的一行出现 a是使用反斜杠 "a \"
- c :取代, c 的后面可以接字串,这些字串可以取代 n1,n2 之间的行!
- d :删除,因为是删除啊,所以 d 后面通常不接任何咚咚;
- i :插入, i 的后面可以接字串,而这些字串会在新的一行出现(目前的上一行);
- p :打印,亦即将某个选择的数据印出。通常 p 会与参数 sed -n 一起运行~
- s :取代,可以直接进行取代的工作哩!通常这个 s 的动作可以搭配正规表示法!例如 1,20s/old/new/g 就是啦!
- q :匹配到结果后立即退出SED脚本,而不处理任何更多的输出(有匹配就返回第一条)
2.动作样例
# 在第四行后添加新字符串(不会改变文件内容)
sed -e "4a\newLine" testfile
sed "4a newLine" testfile # 与上述相同# 删除前一个命令标准输出中的2-5行(包括第二行第五行)
cat /etc/passwd | sed '2,5d'
cat /etc/passwd | sed '3,$d' # 第3到最后一行# 从第二行替换到最后一行内容变为 No 2- number
cat /etc/passwd | sed '2,$c No 2- number'# 以行为单位的删除
cat /etc/passwd | sed '2d' # 删除第2行
cat /etc/passwd | sed '3,$d' # 删除第3到最后一行# 数据搜索并显示
cat /etc/passwd | sed '/root/p'## 替换
与vim的替换非常相似
sed 's/要被取代的字串/新的字串/g'
3. 命令组合
下列命令的逻辑是:
- 首先匹配含有'root' 字段的行
- 匹配到后行执行替换:将含有bash的替换为blushshell
- 然后打印
- 收到第一条打印就立即退出sed脚本
'/匹配模式/{s/old/new/;(sed动作代表替换)p;(打印)q(匹配成功立即返回)'
cat /etc/passwd | sed -n '/root/{s/bash/blueshell/;p;q}'
3.修改文件
这里给出常见的几种需求
1、全文替换,将所有 mc3 替换为 mc4$ a=4
$ sed -i "s/mc3/mc4/" kk.xml如果当前文件mc后接的数字未知, 目标数字也是变量可以如此$ num=5
$ sed -i "s/mc[[:digit:]]\+/<group>mc${num}/" kk.xml这里使用了[[:digit:]]\+ 匹配多位数字亲测在CentOS7 环境中不支持'\d'的用法
-r只能支持'+' 这种用法。以下两种命令效果相同$ sed -i "s/mc[[:digit:]]\+/<group>mc${num}/" kk.xml
$ sed -ri "s/mc[[:digit:]]+/<group>mc${num}/" kk.xml 2、先匹配具体行,然后做替换 模板:sed -i '匹配行/替换的字符串/'sed -i '/^<nginx /mc3/mc5/' kk.xml