0%

sed 学习备忘

sed 学习备忘

调用方式

  • sed [选项] {动作脚本} [输入文件]
  • sed [选项] -f name [输入文件]

选项

  • -n: 安静模式
  • -e: 后跟脚本表达式,可多个
  • -f: 跟脚本文件
  • -r: 使用扩展正则表达式
  • -i: 直接修改文件

动作脚本

  • a: 新增(后一行)
  • c: 取代匹配行
  • d: 删除行
  • i: 插入(上一行)
  • p: 打印,如果没有-n默认打印处理后的全部文本,p会打印处理的问题,故经常一起用。
  • s: 替换

示例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
# 删除
sed '2,5d'
sed '2d'
sed '3,$d'

sed '/root/d'


# 插入
sed '2a insert str'
sed '2i insert str'

# 替换
sed '2,5c No 2-5 number'

# 显示
sed -n '5,7p'
sed -n '/test/,/check/p' #打印test和check之间的行
sed -n '5,/^test/p'
# 搜索 & 替换
sed -n '/root/p' # grep root
sed -n '/root/{s/bash/blueshell/;p}' # 搜索并执行命令
sed '/test/,/check/s/$/test/'
sed -n '/root/{s/bash/blueshell/;p;q}' #替换第一个
sed 's/oldstr/newstr/g' # 如果没有g,则之替换每行第一个匹配
sed 's/正则//g' #删除整行 sed '/正则/d'
sed -n 's/^test/my&/gp'
sed -n 's/\(love\)able/\1rs/gp' love标记为1
sed 's/s/S/1' my.txt # 替换第一个s
sed 's/s/S/2g' my.txt # 第二个以后
# 多命令
sed -e '3,$d' -e 's/bash/blueshell/'
sed '3,$d; s/bash/blueshell/'
# 修改文件
sed -i 's/\.$/\!/g' # 如果行尾为.换为!
sed -i '$a str' # 最后一行加一行

# 读写其他文件
sed '/test/r file'
sed -n '/test/w file'

# 移动 n/N
sed '/test/{n; s/aa/bb/g;}' #匹配test的下一行,替换aa为bb
# 变形
sed '1,10y/abcde/ABCDE/' #1-10行内所有abcde转为大写
# 退出
sed '10q'

Hold Space

  • g: 将hold space中的内容拷贝到pattern space中,原来pattern space里的内容清除
  • G: 将hold space中的内容append到pattern space\n后
  • h: 将pattern space中的内容拷贝到hold space中,原来的hold space里的内容被清除
  • H: 将pattern space中的内容append到hold space\n后
  • x: 交换pattern space和hold space的内容
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
$ cat t.txt
one
two
three
$ sed 'H;g' t.txt
one

one
two

one
two
three
$ sed '1!G;h;$!d' t.txt
three
two
one