sed
是Linux的流编辑器(stream editor)
,用来将数据进行选取
、替换
、删除
、新增
等修改动作。
介绍
sed命令有两种形式:
sed [-Ealnru] command [-I extension] [-i extension] [file ...]
sed [-Ealnru] [-e command] [-f command_file] [-I extension] [-i extension] [file ...]
参数说明:
-n
把经过处理的行输出到屏幕
-e
对输入数据应用多条sed命令编辑
-f
添加脚本文件的内容到执行的动作
-i
直接修改读取数据的文件,不加该参数时默认输出到屏幕
command
即 sed 的动作
- 一般通过单引号
'
引用,业可以通过双引号 "
引用
a\
追加:在当前行后添加一行或多行
- 添加多行时,除最后一行外,每行末尾需要用
\
代表续行
c\
行替换:用 c
后面的字符串替换原数据行,替换多行时,除最后一行外,每行末尾需要用 \
代表续行
i\
插入:当前行前插入一行或多行。插入多行时,除最后一行外,每行末尾需要用 \
代表续行
d
删除指定的行
p
打印指定的行
s
字串替换,用一个字符串替换另外一个字符串,支持的格式:
行范围s/旧字串/新字串/g
,行范围可选,为空表示全局替换(和 vim
中的替换格式类似)
行范围s#旧字串#新字串#g
示例
# 输出第二行,p 一般都要和 -n 使用,不加 -n 会显示出所有的行
sed -n '2p' abc.txt
# 管道符结果作为操作内容
df -h | sed -n '2p'
# 删除文件的第 2 行到第 4 行,没有加 -i 选项,仅输出到屏幕,不更改文件内容
sed '2,4d' abc.txt
# 在第二行后追加 hello,没有加 -i 选项,仅输出到屏幕,不更改文件内容
sed '2a hello' abc.txt
# 在第二行前插入两行数据,没有加 -i 选项,仅输出到屏幕,不更改文件内容
sed '2i hello \
world' abc.txt
# 把第二行替换为No person
sed '2c No person' abc.txt
# 把第二行的O替换为N后输出
sed '2s/O/N/g' abc.txt
# 替换的结果写入文件
sed -i '2s/O/N/g' abc.txt
# -e 允许多条命令顺序执行,用分号隔开,s前面不加数字表示所有行
sed -e 's/xie//g ; s/xianbin//g' abc.txt
# 与 find 一起使用
find . -type f -name "*.yaml" | xargs -i sed -i "s#abc#def#g" {}
F&Q
sed 单引号替换不生效
$ export world=xianbin
$ echo "hello world" | sed 's/world/${world}/g'
hello ${world}
使用双引号 "
正常替换
$ export world=xianbin
$ echo "hello world" | sed "s/world/${world}/g"
hello xianbin