当前位置: 代码迷 >> 综合 >> Linux命令 sed
  详细解决方案

Linux命令 sed

热度:25   发布时间:2024-03-08 10:35:46.0

目录

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. 命令组合

下列命令的逻辑是:

  1. 首先匹配含有'root' 字段的行
  2. 匹配到后行执行替换:将含有bash的替换为blushshell
  3. 然后打印
  4. 收到第一条打印就立即退出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

 

 

 


三、总结