Sed 日常使用介绍
简介
sed
是 unix
环境下常用的流处理工具, 可以处理字符流, 文件或者二进制文件流。
各个 unix/linux
发行版都会配备 sed
及其衍生的命令工具, 因此, 掌握该工具的基本用法, 足以满足我们日常的许多文本处理的任务。
以下采用示例的方式对 sed
进行基本用法介绍. 如果有兴趣了解更高级的使用技巧,
本文采用的是 GNU sed 4.4
版本进行示例介绍, 以下示例可在 GNU bash 4.4.20(1)
版本下运行。
请参阅 参考文档
文章约定
- 本文采用命令行示例来讲解用法, 格式如下:
###
开头内容均为注释$
开头内容均为命令行- 顶格开头内容均为命令执行后输出结果
Sed 日常基本用法
Sed 打印/输出
- 打印出匹配条件的内容
### -n 选项代表只打印匹配的行
### 如果没有 -n 选项, 则会打印所有输入内容, 同时再打印匹配的内容
$ echo -e "hello
python
php" | sed -n -e '/python/p'
python
- 打印第 3 行内容
$ echo "hello
python
and
php" | sed -n -e '3 p'
- 打印第 1~2 行内容
$ echo -e "hello
python
php" | sed -e '1,2p' sample.txt
hello
python
- 输出 1~7 数字序列,每行一个数字,每3行替换数字为 x
$ seq 7 | sed -e 'n; n; s/./x/g'
1
2
x
4
5
x
- 不打印第 2~3 行
$ echo "hello
world
python" | sed -n -e "2,3! p"
- 打印从第 1 行开始, 第 n 次输出行为 1 + n * 3 的行
$ seq 10 | sed -n -e '1~3p'
1
4
7
10
Sed 删除
- 删除包含 python 的行, 忽略大小写
### /regex/ regex 是正则, I 表示忽略大小写, d 表示删除匹配内容
$ echo -e "hello
python 2.7
php
Python 3
IPython
C++" | sed -e '/python/Id'
hello
php
C++
- 删除第 2 行
$ echo -e "hello
python 2.7
php
Python 3" | sed -e '2d'
hello
php
Python 3
- 删除 2~3 行
$ echo -e "hello
python 2.7
php
Python 3
IPython
C++" | sed -e '2,3d'
hello
Python 3
IPython
C++
- 从第 2 行删除到最后一行
$ echo -e "hello
python 2.7
php
Python 3
IPython
C++" | sed -e '2,$d'
hello
- 删除所有空行
$ 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
$ 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
$ 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
$ 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.
### 注意 ! 和 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
$ 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.
- 在正则替换表达式中, 使用其他字符替换 '/' 作为分隔符
### 替换目录 '/aaa/bbb' 为 '/var/log', 使用 | 作为分隔符
$ echo "/aaa/bbb/ccc" | sed -e 's|/aaa/bbb|/var/log|g'
/var/log/ccc
- 使用正则匹配的内容进行替换
$ echo "Hello, I like python" | sed -e 's/python/& and php/'
Hello, I like python and php
- 获取正则匹配的分组内容的第一部分
$ 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
$ echo "I like python and php." | sed -e 'y/aeio/AEIO/'
I lIkE pythOn And php.
Sed 替换文件内容
- 直接替换文件内容, 把所有包含 python 的行删除.
### -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.