Sed 日常使用介绍

Sed 日常使用介绍#

简介#

sedunix 环境下常用的流处理工具, 可以处理字符流, 文件或者二进制文件流。

各个 unix/linux 发行版都会配备 sed 及其衍生的命令工具, 因此, 掌握该工具的基本用法, 足以满足我们日常的许多文本处理的任务。

以下采用示例的方式对 sed 进行基本用法介绍. 如果有兴趣了解更高级的使用技巧,
本文采用的是 GNU sed 4.4 版本进行示例介绍, 以下示例可在 GNU bash 4.4.20(1) 版本下运行。

请参阅 参考文档

文章约定#

  • 本文采用命令行示例来讲解用法, 格式如下:
    • ### 开头内容均为注释
    • $ 开头内容均为命令行
    • 顶格开头内容均为命令执行后输出结果

Sed 日常基本用法#

Sed 打印/输出#

  • 打印出匹配条件的内容
Copy
### -n 选项代表只打印匹配的行 ### 如果没有 -n 选项, 则会打印所有输入内容, 同时再打印匹配的内容 $ echo -e "hello\npython\nphp" | sed -n -e '/python/p' python
  • 打印第 3 行内容
Copy
$ echo "hello python and php" | sed -n -e '3 p'
  • 打印第 1~2 行内容
Copy
$ echo -e "hello\npython\nphp" | sed -e '1,2p' sample.txt hello python
  • 输出 1~7 数字序列,每行一个数字,每3行替换数字为 x
Copy
$ seq 7 | sed -e 'n; n; s/./x/g' 1 2 x 4 5 x
  • 不打印第 2~3 行
Copy
$ echo "hello world python" | sed -n -e "2,3! p"
  • 打印从第 1 行开始, 第 n 次输出行为 1 + n * 3 的行
Copy
$ seq 10 | sed -n -e '1~3p' 1 4 7 10

Sed 删除#

  • 删除包含 python 的行, 忽略大小写
Copy
### /regex/ regex 是正则, I 表示忽略大小写, d 表示删除匹配内容 $ echo -e "hello\npython 2.7\nphp\nPython 3\nIPython\nC++" | sed -e '/python/Id' hello php C++
  • 删除第 2 行
Copy
$ echo -e "hello\npython 2.7\nphp\nPython 3" | sed -e '2d' hello php Python 3
  • 删除 2~3 行
Copy
$ echo -e "hello\npython 2.7\nphp\nPython 3\nIPython\nC++" | sed -e '2,3d' hello Python 3 IPython C++
  • 从第 2 行删除到最后一行
Copy
$ echo -e "hello\npython 2.7\nphp\nPython 3\nIPython\nC++" | sed -e '2,$d' hello
  • 删除所有空行
Copy
$ echo "hello, world. hello, python." | sed -e '/^\s*$/d' hello, world. hello, python.

Sed 替换#

Sed 替换命令格式

替换命令格式: [address range]s/regex/replacement/[flags]

  • s: 表示替换命令
  • regex: 正则表达式
  • replacement: 替换内容. & 可以获取匹配的内容, \N 可以获取匹配分组的内容, \1 可以获得正则匹配到的分组内容第一个元素
  • flags:
  • g - 全部替换
  • 其他请参考 manual (如: 命令行 man sed)
Sed 替换示例
  • 替换第一个 cat 为 dog
Copy
$ echo -e "I like cat but you don't like cat!" | sed -e 's/cat/dog/' I like dog but you don't like cat!
  • 替换所有的 cat 为 dog
Copy
$ echo -e "Everyone like cat and I like cat too!" | sed -e 's/cat/dog/g' Everyone like dog and I like dog too!
  • 在所有包含 cat 的行中, 替换 python 为 php
Copy
$ echo "Tom like cat and python. James like dog and python. Kate like cat and php." | sed -e '/cat/ s/python/php/g' Tom like cat and php. James like dog and python. Kate like cat and php.
  • 在所有不包含 cat 的行中, 替换 python 为 php.
Copy
### 注意 ! 和 s 之间需要有空格. /cat/! 标示匹配 /cat/ 范围之外的行 ### 同理, 1,2! 标示不要第 1 到 第 2 行 $ echo "Tom like cat and python. James like dog and python. Kate like cat and php." | sed -e '/cat/! s/python/php/g' Tom like cat and python. James like dog and php. Kate like cat and php.
  • 在第 2~3 行中, 替换 python 为 php
Copy
$ echo "I like python. James like python too. Kate like go and python." | sed -e '2,3s/python/php/g' I like python. James like php too. Kate like go and php.
  • 在正则替换表达式中, 使用其他字符替换 '/' 作为分隔符
Copy
### 替换目录 '/aaa/bbb' 为 '/var/log', 使用 | 作为分隔符 $ echo "/aaa/bbb/ccc" | sed -e 's|/aaa/bbb|/var/log|g' /var/log/ccc
  • 使用正则匹配的内容进行替换
Copy
$ echo "Hello, I like python" | sed -e 's/python/& and php/' Hello, I like python and php
  • 获取正则匹配的分组内容的第一部分
Copy
$ echo "Hello, I like python" | sed -e 's/\(python\)/\1 and php/' Hello, I like python and php

Sed 一对一转换特定字符#

  • 把 a e i o 字母一一转换为 A E I O
Copy
$ echo "I like python and php." | sed -e 'y/aeio/AEIO/' I lIkE pythOn And php.

Sed 替换文件内容#

  • 直接替换文件内容, 把所有包含 python 的行删除.
Copy
### -i[backup_suffix] 后面紧跟着备份文件名后缀名. ### 如果 [backup_suffix]为 '' 空字符串,则表示直接替换原始文件内容,不备份 $ cat sample.txt Hello world. I like python and php. $ sed -i'' -e '/python/d' sample.txt $ cat sample.txt Hello world.

参考文档#

posted @   Yxh_blogs  阅读(213)  评论(0编辑  收藏  举报
编辑推荐:
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 一个奇形怪状的面试题:Bean中的CHM要不要加volatile?
· [.NET]调用本地 Deepseek 模型
· 一个费力不讨好的项目,让我损失了近一半的绩效!
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示
CONTENTS