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

# 将23行修改为一个新行
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
posted @   箫笛  阅读(127)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战
点击右上角即可分享
微信分享提示