shell编程 - sed编辑器
1. sed命令格式
sed options script file
cat test.txt # 输出test.txt内容
this is test 1
this is test 2
this is test 3
sed 's/test/Test/' test.txt # 将test.txt中所有的test替换为Test
this is Test 1
this is Test 2
this is Test 3
-n 不产生命令输出
# 使用替换命令(s)中的p标记输出
sed -n 's/test/Test/p' test.txt
# 使用打印命令(p)来输出
sed -n '{
s/test/Test/
p
}' ./test.txt
-e 使用多个命令时
# 多个命令在一行时,用;隔开
sed -e 's/test/Test/; s/this/that/' test.txt
# 每个命令单独占一行
sed -e '
s/test/Test/
s/this/that/
' test.txt
-f 使用指定的sed脚本文件作为命令输入
cat test.sed # 输出test.sed内容
s/test/Test/
s/this/that/
sed -f test.sed test.txt
2. 使用寻址
[address]command # 单个命令
[address]{ # 多个命令
command1
command2
command3
}
- 使用数字形式表示的行区间
sed '2s/test/Test/' test.txt # 在第二行执行替换命令
sed '2,3s/test/Test/' test.txt # 在第二到第三行执行替换命令
sed '2,$s/test/Test/' test.txt # 在第二到最后一行执行替换命令
- 使用文本模式过滤出特定行
sed '/test 1/s/test/Test/' test.txt # 搜索具有test 1的行执行替换命令
- 在特定行上执行多个命令
# 在第二行到最后一行执行多个命令,只输出整个限定范围的行
sed -n '2,${
s/test/Test/
s/this/That/
p
}' test.txt
# 过滤具有test 1字符串的行上执行多个命令,并只输出过滤的特定行
sed -n '/test 1/{
s/test/Test/
s/this/That/
p
}' test.txt
3. 替换命令(s)
s/pattern/replacement/flags
替换标记:
- 数字,表明新文本将替换第几处模式匹配的地方
sed 's/test/Test/1' test.txt
- g, 表明新文本将会替换所有匹配的文本
sed 's/test/Test/g' test.text
- p, 表明替换后的行内容要打印出来
sed 's/test/Test/p' test.text
- w file, 将替换的结果写入文件中
sed 's/test/Test/w data.txt' test.txt
替换字符: /
# 替换模式中如果有/则必须进行转义
sed 's/\/bin\/bash/\/bin/zsh/' /etc/passwd
# 将替换字符用 ! 代替
sed 's!/bin/bash!/bin/zsh!' /etc/passwd
4. 删除命令(d)
[address]d
# 没有寻址模式时,会删除所有的行
sed 'd' test.txt
# 删除第二行
sed '2d' test.txt
# 删除第一行到第二行
sed '1,2d' test.txt
# 删除第二行到最后一行
sed '2,$d' test.txt
# 删除包含test 1的文本行
sed '/test 1/d' test.txt
# 删除包含test 1到test 2的所有文本行
# 如果找不到test 2则会删除test 1以后的所有文本行
sed '/test 1/,/test 2/d' test.txt
5. 插入命令(i)
[address]i\
# 在第二行之前加入一个新行
sed '2i\
this is test new line
' test.txt
# 在最后一行之前加入两行
sed '$i\
this is test new line\
this is another test new line
' test.txt
# 在具有test 2的行之前加入一个新行
sed '/test 2/i\
this is test new line
' test.txt
6. 附加命令(a)
[address]a\
# 在第二行之后加入一个新行
sed '2a\
this is test new line
' test.txt
# 在最后一行之加入两行
sed '$a\
this is test new line\
this is another test new line
' test.txt
# 在具有test 2的行之后加入一个新行
sed '/test 2/a\
this is test new line
' test.txt
7. 修改命令(c)
[address]c\
# 修改第二行的内容
sed '2c\
this is changed line
' test.txt
# 修改具有test 2的行
sed '/test 2/c\
this is changed line
' test.txt
# 将2到3行修改为一个新行
sed '2,3c\
this is changed line
' test.txt
8. 转换命令(y)
[address]y/inchars/outchars/
# 将第二行中的字符t转为T, 2 转为4
sed '2y/t2/T4/' test.txt
9. 打印命令(p)
[address]p
# 打印第一行
sed -n '1p' test.txt
# 打印test 1 的特定行
sed -n '/test 1/p' test.txt
# 执行替换命令之前先打印查看
sed -n '/test 1/{
p
s/test 1/Test 1/p
}' test.txt
10. 打印行号命令(=)
[address]=
# 打印所有行号
sed '=' test.txt
# 打印特定行的行号和内容
sed -n '/test 2/{
=
p
}' test.txt
11. 列出行内容命令(l)
[address]l
# 列出所有行内容包括控制字符以及不可见字符
sed -n 'l' test.txt
# 列出特定行内容
sed -n '/test 1/l' test.txt
12. 写入命令(w)
[address]w filename
# 将第一行到第二行写入data.txt 文件
sed '1,2w data.txt' test.txt
# 将test 1行写入data.txt文件,并控制其没有输出test.txt到控制台
sed -n '/test 1/w data.txt' test.txt
13. 读取命令(r)
[address]r filename
# 读取data.txt的内容并插入到test.txt的第二行之后
sed '2r data.txt' test.txt
# 读取data.txt的内容并插入到test.txt中具有'test 2'行之后
sed '/test 2/r data.txt' test.txt
# 读取data.txt的内容并插入到test.txt的行末尾
sed '$r data.txt' test.txt
# 读取data.txt的内容,并插入到placeholder占位符之后,然后删掉占位符
sed '/placeholder/{
r data.txt
d
}' test.txt
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战