【shell】sed命令用法详解

一、基本概念

sed(Stream Editor)是Linux中一款流式文本编辑器,以非交互方式逐行处理文本数据。其核心原理是模式空间​(临时缓冲区),每次读取一行内容到模式空间,通过编辑命令处理后输出结果,最后清空缓冲区并处理下一行。默认情况下,sed不会直接修改源文件,而是输出到屏幕。

二、语法结构
sed [选项] '编辑命令' 输入文件
sed [选项] -f 脚本文件 输入文件

示例

  • sed -n '1,5p' file.txt:打印文件第1到5行。
  • sed -i.bak 's/old/new/g' file.txt:直接修改文件并备份原文件为file.txt.bak

三、常用选项
选项说明
-n禁止默认输出,仅显示处理后的行(常与p命令联用)
-e指定多个编辑命令(如sed -e 's/a/A/' -e 's/b/B/'
-i直接修改源文件(危险操作,建议先备份)
-r启用扩展正则表达式(如支持+?等元字符)
-f从脚本文件读取编辑命令(适合复杂操作)

四、核心编辑命令
  1. 增删改操作

    • 追加 a\text:在匹配行后添加文本
      示例sed '/test/a\-->追加内容' file.txt
    • 插入 i\text:在匹配行前插入文本
      示例sed '3i\插入到第3行前' file.txt
    • 替换整行 c\text:替换匹配行内容
      示例sed '/error/c\修复后的内容' file.txt
    • 删除行 d:删除匹配行
      示例sed '/^#/d' file.txt(删除所有注释行)。
  2. 文本替换 s/pattern/replacement/[flags]

    • 基本替换sed 's/old/new/'(仅替换每行第一个匹配)。
    • 全局替换sed 's/old/new/g'(替换所有匹配)。
    • 标记扩展
      • p:仅打印替换成功的行(需搭配-n
        示例sed -n 's/error/OK/p' log.txt
      • w file:将替换结果写入文件
        示例sed 's/error/OK/w output.txt' log.txt
  3. 高级操作

    • 模式空间与保持空间
      • h/H:将模式空间内容复制/追加到保持空间。
      • g/G:将保持空间内容复制/追加到模式空间。
        示例sed -e '/test/h' -e '$G' file.txt(复制匹配行到文件末尾)。

五、地址定位与正则表达式
  1. 行号定位

    • sed '2d':删除第2行。
    • sed '1,5s/old/new/:处理1到5行。
    • sed '$d':删除最后一行。
  2. 正则匹配

    • /pattern/:匹配包含模式的行
      示例sed '/^192.168/p'(打印以IP开头的行)。
    • 范围匹配/start/,/end/
      示例sed '/BEGIN/,/END/d'(删除两标记之间的所有行)。
  3. 正则元字符

    元字符说明示例
    ^行首锚定/^test/匹配以test开头的行
    $行尾锚定/end$/匹配以end结尾的行
    \</\>单词边界/\<word\>/匹配独立单词word

    5

    .*任意字符s/a.*b/xyz/替换ab之间的所有内容

六、典型应用示例
  1. 删除空行与注释

    sed -r '/^$|^#/d' config.conf  # 删除空行和注释行[3,5](@ref)
  2. 批量替换文件内容

    sed -i 's/旧域名/新域名/g' *.html  # 修改所有HTML文件的域名[6](@ref)
    
  3. 提取特定行

    sed -n '10,20p' data.log  # 仅输出第10到20行[3](@ref)
    
  4. 复杂文本重组

    sed -n '1~2p' file.txt  # 打印奇数行(步长为2)[3,5](@ref)
七、sed命令实例
  1. 向文件中添加或插入行

    • sed '3ahello' 1.txt:向第三行后面添加hello,3表示行号。
    • sed '/123/ahello' 1.txt:向内容123后面添加hello,如果文件中有多行包括123,则每一行后面都会添加。
    • sed '$ahello' 1.txt:在最后一行添加hello。
    • sed '3ihello' 1.txt:在第三行之前插入hello。
    • sed '/123/ihello' 1.txt:在包含123的行之前插入hello,如果有多行包含123,则包含123的每一行之前都会插入hello。
    • sed '$ihello' 1.txt:在最后一行之前插入hello。
  2. 更改文件中指定的行

    • sed '1chello' 1.txt:将文件1.txt的第一行替换为hello。
    • sed '/123/chello' 1.txt:将包含123的行替换为hello。
    • sed '$chello' 1.txt:将最后一行替换为hello。
  3. 删除文件中的行

    • sed '4d' 1.txt:删除第四行。
    • sed '1~2d' 1.txt:从第一行开始删除,每隔2行就删掉一行,即删除奇数行。
    • sed '1,2d' 1.txt:删除1~2行。
    • sed '1,2!。d' 1.txt:删除1~2之外的所有行。
    • sed '$d' 1.txt:删除最后一行。
    • sed '/123/d' 1.txt:删除匹配123的行。
    • sed '/123/,$d' 1.txt:删除从匹配123的行到最后一行。
    • sed '/123/,+1d' 1.txt:删除匹配123的行及其后面一行。
    • sed '/^$/d' 1.txt:删除空行。
    • sed '/123\|abc/!.d' 1.txt:删除不匹配123或abc的行,/123|abc/表示匹配123或abc,!。表示取反。
    • sed '1,3{/123/d}' 1.txt:删除13行中,匹配内容123的行,1,3表示匹配13行,{/123/d}表示删除匹配123的行。
  4. 替换文件中的内容

    • sed 's/123/hello/' 1.txt:将文件中的123替换为hello,默认只替换每行第一个123。
    • sed 's/123/hello/g' 1.txt:将文本中所有的123都替换为hello。
    • sed 's/123/hello/2' 1.txt:将每行中第二个匹配的123替换为hello。
    • sed -n 's/123/hello/gpw 2.txt' 1.txt:将每行中所有匹配的123替换为hello,并将替换后的内容写入2.txt。
    • sed '/#/s/,.*//g' 1.txt:匹配有#号的行,替换匹配行中逗号后的所有内容为空(,.*)表示逗号后的所有内容。
    • sed 's/..$//g' 1.txt:替换每行中的最后两个字符为空,每个点代表一个字符,表示匹配末尾(..)表示匹配最后两个字符。
    • sed 's/^#.*//' 1.txt:将1.txt文件中以#开头的行替换为空行,即注释的行(^#)表示匹配以#开头,(.*)代表所有内容。
    • sed 's/^#.*//;/^$/d' 1.txt:先替换1.txt文件中所有注释的空行为空行,然后删除空行,替换和删除操作中间用分号隔开。
    • sed 's/^[0-9]/(&)/' 1.txt:将每一行中行首的数字加上一个小括号(^[0-9])表示行首是数字,&符号代表匹配的内容。
    • sed 's/[0−9][0−9]/(\1)/' 1.txt:替换左侧特殊字符需转义,右侧不需要转义,\1代表匹配的内容。
    • sed 's/$/&'haha'/' 1.txt:在1.txt文件的每一行后面加上“haha”字段。
  5. 打印文件中的行

    • sed -n '3p' 1.txt:打印文件中的第三行内容。
    • sed -n '2~2p' 1.txt:从第二行开始,每隔两行打印一行,波浪号后面的2表示步长。
    • sed -n '$p' 1.txt:打印文件的最后一行。
    • sed -n '1,3p' 1.txt:打印1到3行。
    • sed -n '3,$p' 1.txt:打印从第3行到最后一行的内容。
    • sed -n '/you/p' 1.txt:逐行读取文件,打印匹配you的行。
    • sed -n '/bob/,3p' 1.txt:逐行读取文件,打印从匹配bob的行到第3行的内容。
    • sed -n '/you/,3p' 1.txt:打印匹配you的行到第3行,也打印后面所有匹配you的行。
    • sed -n '1,/too/p' 1.txt:打印第一行到匹配too的行。
    • sed -n '3,/you/p' 1.txt:只打印第三行到匹配you的行。
    • sed -n '/too/,$p' 1.txt:打印从匹配too的行到最后一行的内容。
    • sed -n '/too/,+1p' 1.txt:打印匹配too的行及其向后一行,如果有多行匹配too,则匹配的每一行都会向后多打印一行。
    • sed -n '/bob/,/too/p' 1.txt:打印从匹配内容bob到匹配内容too的行。
  6. 打印文件的行号

    • sed -n "$=" 1.txt:打印1.txt文件最后一行的行号(即文件有多少行,和wc -l功能类似)。
    • sed -n '/error/=' 1.txt:打印匹配error的行的行号。
八、模式空间中的编辑操作
  1. 地址定界

    • #:#为数字,指定要进行处理操作的行。
    • $:表示最后一行,多个文件进行操作的时候,为最后一个文件的最后一行。
    • /regexp/:表示能够被regexp匹配到的行
九、sed的工作流程

sed的工作流程主要包括读取、执行和显示三个过程:

  1. 读取:sed从输入流(文件、管道、标准输入)中读取一行内容并存储到临时的缓冲区中(又称模式空间,pattern space)。
  2. 执行:默认情况下,所有的sed命令都在模式空间中顺序地执行,除非指定了行的地址,否则sed命令将会在所有的行上依次执行。
  3. 显示:发送修改后的内容到输出流。
十、注意事项
  1. 备份文件:使用-i时建议添加备份后缀(如-i.bak)。
  2. 正则转义:特殊字符需转义,如\/需写作\\/
  3. 性能优化:对大文件避免频繁使用-i,可先处理输出到临时文件。

通过灵活组合选项、命令和正则表达式,sed可实现高效的文本处理,适合日志分析、配置修改等场景。更多高级用法可参考GNU sed手册或相关文档

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

浩瀚之水_csdn

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值