Sed
Aug 12, 2023sed = stream editor。sed 主要用于对文件、输入进行编辑。默认 sed 不会对输入的内容进行修改。
搜索替换
sed 的使用语法大致如下
sed [command] [searchPattern or range/]command/oldWord/newWord/[flag] fileName
再指定范围内,对 fileName 进行 command 操作,对输出进行 flag 处理
command 包括
| 命令 | 含义 |
|---|---|
| s | 字符串查找替换,默认只处理每行符合条件的第一个 |
| y | 字符查找替换,一行内的所有匹配字符都会处理 |
| d | 删除 |
| a | append,添加在指定行后 |
| i | Insert,插入在指定行前 |
| c | Change,更改指定行内容 |
flag 包括
| 命令 | 含义 |
|---|---|
| p | 再处理命令前,先输出一次源文本 |
| g | |
s 模式 subibitute
# 将每行第一个 dog 转换为 cat
sed "s/dog/cat/" demo.txt
# 将每行第一个 dog 转换为 cat,如果发生处理,先输出一遍原文本
sed "s/dog/cat/p" demo.txt
# 将每行所有 dog 转换为 cat
sed "s/dog/cat/g" demo.txt
# 将第 2 行的 dog 转换为 cat
sed "2s/dog/cat/" demo.txt
# 将第最后 1 行的 dog 转换为 cat
sed "$s/dog/cat/" demo.txt
# 将第 2 - 4 行的 dog 转换为 cat
sed "2, 4s/dog/cat/" demo.txt
# 将第 2 - 最后一行的 dog 转换为 cat
sed "2, $s/dog/cat/" demo.txt
# 先过滤出以 It 开头的行, dog 转换为 cat
sed "/^It/s/dog/cat/" demo.txt
# 注意,先找到第一个包含 line1 行,开始执行 s 命令,直到找到 line3 行
sed "/line1/,/line3/s/dog/cat/" demo.txt
注意:
- 最后一个例子中,如果没找到匹配到 line3 的行,就相当于一直处理到结尾。
两行合并
sed -n 'N;s/\n/\t/p'
匹配空格
# MacOS 下
sed 's/[[:space:]]*//'
合并操作
sed -n '
s/[[:space:]]*"prefix": "/\|/
s/",$/\|/
s/".*"/\|/p
'
留意当多行命令结合 -n 和 /p 的组合使用,时只需要最后一个指令带有 /p 即可。
多次 s 的操作其实无需每一次处理都输出,最终展示的只是最后一次,所以仅在最后加
/p输出
Mac 下,i\,a\ 模式后需要加入内容的都需要换行,如
# Error
echo "abc" | sed '1i\Hello world\'
output: sed: 1: "1i\Hello world\": extra characters after \ at the end of i command
# Correct
echo "abc" | sed '1i\
Hello world '
output: Hello World abc
sed 中使用变量
需要把使用 ${paramName},并将单引号换成双引号
param="1"
# 不报错,但会直接当做 ${param} 使用
echo "abc" | sed 's/a/${param}'
# 正确
echo "abc" | sed "s/a/${param}"
Comments