Linux命令_sed & 快速修改、删除、增加、过滤文件内容

前言

        sed是一个流编辑器。流编辑器用于对输入流(文件或来自管道的输入)执行基本的文本转换。虽然在某些方面类似于允许脚本编辑的编辑器,但sed的工作方式是只对输入进行一次传递,因此效率更高。但是sed在管道中过滤文本的能力是它与其他类型编辑器的特别之处。

目录

1. 语法

1.1. 参数解释

1.2. 动作解释

2. 常见用法

2.1. *********** 增 ***********

2.1.1. 指定添加到下一行

2.2.2. 指定添加到上一行

2.2.3. 指定添加到行首

2.2.4. 指定添加到行尾

2.2.5. 增加多行

2.2. *********** 删 ***********

2.2.1. 删除指定行数

2.2.2. 删除以什么开头的行

2.2.3. 删除以什么结尾的行

2.2.4. 删除包含某个字符串的行

2.2.5. 删除注释的行

 2.2.6. 批量取消注释

2.3. *********** 改 ***********

2.3.1. 指定行数修改字符串

2.3.2. 修改包含某个字符串的行

2.4. *********** 查 ***********

2.4.1. 查询指定行

2.4.2. 查询最后一行

2.4.3. 查询匹配的后一行

2.4.4. 查询匹配的上一行

2.4.5. 查询总行数

2.4.6. 查询包含某个字符串的行

2.4.7. 查询包含某2个字符串的范围

2.4.8. 连续匹配

2.4.9. 忽略大小写

2.4.10. 正则表达式

2.4.11. 修改匹配符

3. 文本三剑客其他命令


1. 语法

sed  [选项]  {自编脚本}  [文件]

 

1.1. 参数解释

-n:取消自动打印模式空间(常用)
-i:编辑文件(常用)
-r:在脚本中使用扩展正则表达式(常用)
-f:添加“脚本文件”到程序的运行列表
-s:处理多个文件时,将输入文件视为各个独立的文件而不是一个长的连续输入

 

 

1.2. 动作解释

s:替换某个字符串
c:替换某行
d:删除某行
p:打印某行
a:在指定行的下一行添加字符串
i:在指定行的上一行添加字符串
I:忽略大小写

 

 

 

2. 常见用法

2.1. *********** 增 ***********

2.1.1. 指定添加到下一行

sed "2a 'ss' oo" file.txt       # 2a表示在第2行后面添加指定字符串,仅输出,不修改文件
sed -i "2a 'ss' oo" file.txt    # 加入 -i 直接修改文件

 

 

2.2.2. 指定添加到上一行

sed '2i oo' file.txt       # 2i表示在第2行前面添加指定字符串,仅输出,不修改文件
sed -i '2i oo' file.txt    # 加入 -i 直接修改文件

 

 

2.2.3. 指定添加到行首

sed '2s/^/oo/' file.txt       # /表示分隔符,2s表示修改第2行,^表示行首,oo表示需要添加的字符串。不修改文件
sed -i '2s/^/oo/' file.txt    # 加入 -i 直接修改文件

sed -i  '/^rm/s/^/#/' file.txt        #注释以rm开头的行

sed -i  '3s/^/#/' file.txt              #注释第3行

sed -i  '3,6s/^/#/' file.txt           #注释第3-6行

 

 

2.2.4. 指定添加到行尾

sed '2s/$/oo/' file.txt       # /表示分隔符,2s表示修改第2行,$表示行首,oo表示需要添加的字符串。不修改文件
sed -i '2s/$/oo/' file.txt    # 加入 -i 直接修改文件

sed -i '1,5s/$/;/' file.txt        #1-5行 行尾添加符号 ;

 

 

2.2.5. 增加多行

sed -r '2a 增加的第一行\n增加的第二行' file.txt    # \n表示换行

 

除了指定某行,还可以使用模糊匹配、正则匹配

sed  '/ [模糊匹配内容] /a/ [需要修改的内容] / [修改后的内容] /' filename

sed  -r  '/ [正则匹配内容] /a/ [需要修改的内容] / [修改后的内容] /' filename

 

 

2.2. *********** 删 ***********

2.2.1. 删除指定行数

sed -i '2d' file.txt       # 删除第2行
sed -i '2,8d' file.txt     # 删除 2-8 行
sed -i '$d' file.txt       # 删除最后1行

 

 

2.2.2. 删除以什么开头的行

sed -i '/^a/d' file.txt    # 删除以a开头的行

 

 

2.2.3. 删除以什么结尾的行

sed -i '/7$/d' file.txt    # 删除以7结尾的行(7可以为任意字符串)

 

 

2.2.4. 删除包含某个字符串的行

sed -i '/a/d' file.txt    # 删除包含a的行

 

 

2.2.5. 删除注释的行

sed -i '/^#/d' file.txt    # 删除以#开头的行

 

 

 2.2.6. 批量取消注释

sed -i 's/^#//' file.txt    # s表示替换,使用正则匹配以#开头,替换为空。不修改文件

 

 

 

2.3. *********** 改 ***********

2.3.1. 指定行数修改字符串

sed '1s/a/b/g' file.txt       # 1s表示修改第一行,a表示需要修改的内容,b表示修改后的内容,g表示1行内全部a都修改为b。不修改文件
sed -i '1s/a/b/g' file.txt    # 加入 -i 直接修改文件

sed '1,3s/a/b/g' file.txt        # 修改 1-3 行(将a替换为b)

  

 

2.3.2. 修改包含某个字符串的行

sed '/a/s/a/oo/g' file.txt       # 将带有a的行,把a修改为oo。不修改文件
sed -i '/a/s/a/oo/g' file.txt    # 加入 -i 直接修改文件

 

除了指定某行,还可以使用正则匹配

sed  -r  '/ [正则匹配内容] /s/ [需要修改的内容] / [修改后的内容] /' filename

 

 

2.4. *********** 查 ***********

2.4.1. 查询指定行

sed -n '1p' file.txt    # -n抑制内存输出

查询 1-3 行

sed -n '1,3p' file.txt

分片查询,输出行1,4,7...

sed -n '1~3p' file.txt   # 1表示起始行,3表示间隔3行

分片查询,输出行2,4,6,8...

sed -n '2~2p' file.txt

 

 

2.4.2. 查询最后一行

seq 1 10 |sed -n '$p'    # $表示结尾

不输出最后一行(!取反)

seq 1 10 |sed -n '$!p'

输出倒数第2行

sed -n '${x;p};h'

 

 

2.4.3. 查询匹配的后一行

seq 1 10 |sed -n '/5/ {n;p}'    # n表示读取下一行

输出匹配行 + 下一行

seq 1 10 |sed -n '/5/, +1p'

 

 

2.4.4. 查询匹配的上一行

seq 1 10 |sed -n '/4/ {x;p}; h'

 

 

2.4.5. 查询总行数

seq 1 10 |sed -n "$="

 

 

2.4.6. 查询包含某个字符串的行

sed -n '/a/p' file.txt    # 匹配带有a的行,p表示打印

 

  

2.4.7. 查询包含某2个字符串的范围

seq 1 10 |sed -n '/^2/, /^5/p'    # 匹配以2开头和以5开头的行,取中间范围

 

 

2.4.8. 连续匹配

seq 1 10 |sed -n '/3/p; '/6/p''    # 使用分号分割

 

 

 

2.4.9. 忽略大小写

echo "AabcDe" |sed -n 's/a/0/Igp'
    I:忽略大小写
    g:表示全部
    p:打印

 

 

2.4.10. 正则表达式

字符解释用法
^匹配以什么开始sed -n '/^ab/p' 匹配以ab开头的行
$匹配以什么结尾sed -n '/ab$/p' 匹配以ab结尾的行
.匹配任意一个字符sed -n '/a.c/p'  只匹配a与c之间拥有一个字符的行
.+匹配1次或多次sed -n '/a.+c/p' 匹配a与c之间任意字符的行,不包含ac
*匹配0次或多次sed -n '/a*c/p'  匹配a与c之间任意字符的行,包含ac
|相当于 orsed -n '/ab|ac/p' 匹配包含ab或ac的行
[]匹配括号中任意一个字符sed -n '/[ac]/p'   匹配包含a或c的行
[^]匹配非括号中任意一个字符sed -n '/[^ac]/p' 匹配不包含a或c的行
-[0-9] 匹配数字sed -n '/[0-9]/p' 匹配包含数字的行
[^0-9] 匹配非数字sed -n '/[^0-9]/p' 匹配不包含数字的行
[a-z] 匹配小写字符串sed -n '/[a-z]/p' 匹配包含小写字符串的行
[^a-z] 匹配非小写字符串sed -n '/[^a-z]/p' 匹配不包含小写字符串的行
[A-Z] 匹配大写字符串sed -n '/[A-Z]/p' 匹配包含大写字符串的行
[^A-Z] 匹配非大写字符串sed -n '/[^A-Z]/p' 匹配不包含大写字符串的行
()(a|b) 匹配括号中任意字符sed -n '/0(a|b)1/p' 只匹配0a1和0b1的行
(a)+ 匹配包含1个或多个ased -n '/0(a)+1/p' 匹配0和1之前1个或多个a,0a1、0aa1...
{}{n} 指定匹配n个以上sed -n '/ab{2}/p' 匹配包含ab,且a或b连续为2次以上:abb
{n,m} 指定匹配 n-m 个sed -n '/ab{2,3}/p' 匹配包含ab,且a或b连续为2-3次:abb、aaab

示例(适用于所有增、删、改、查):

# -n 表示抑制内存输出,-r 表示正则匹配
sed -n -r '/^a/p' file.txt    # 匹配以 a 开头的行
sed -n -r '/b$/p' file.txt    # 匹配以 b 结尾的行

 

 

2.4.11. 修改匹配符

sed '/b/s#b#o#' file.txt

 

需要注意的是:模糊匹配处只能使用 /

 

 

 

3. 文本三剑客其他命令

Linux命令_awk常用指南

Linux命令_grep常用指南

  • 8
    点赞
  • 40
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值