- # 语法:
- sed [options] 'command' in_file[s]
options 部分:
-n 静默输出 (不打印默认输出)
-e 给予 sed 多个命令的时候需要 - e 选项
#sed -e 's/root/haha/g' -e 's/bash/wwwww/g' passwd> passwd.bak
如果不用 - e 选项也可以用分号 ";" 把多个命令隔开.
#sed 's/haha/ro/g ; s/wwwww/kkkk/g' passwd | less
-i -i 后面没有扩展名的话直接修改文件, 如果有扩展名备份源文件, 产生以扩展名结尾的新文件
#sed -iback1 -e 's/root/rottt/g' -e 's/bash/wwwww/g' passwd.back // 选项 - i 后面没有空格
[root@localhost 桌面]# ls
manifest.txt passwdback1
-f 当有多个要编辑的项目时, 可以将编辑命令放进一个脚本里, 再使用 sed 搭配 - f 选项
[root@localhost 桌面]# cat s.sed
- s/bin/a/g
- s/ftp/b/g
- s/mail/c/g
[root@localhost 桌面]# sed -f s.sed passwd | less
- #command 部分:
- '[地址 1, 地址 2] [函数] [参数 (标记)]'
定址: /[0-9]+/ 以它为 地址标准的才能执行后边 awk 内容或 sed 内容
行地址对于任何命令都是可选的, 它可以是一个模式, 或者由斜杠, 行号或行寻址符号括住的正则表达式, 大多数 sed 命令能接受由逗号分隔的两个地址, 有些命令只接受单个行地址
命令还可以用大括号进行分组, 第一个命令可以和大括号放在同一行, 但是右大括号必须自己一行
定址的方法 1. 数字 2. 正则
数字 (行号): 十进制数
1 单行
#sed -n '1p' passwd p 是打印函数
1,3 范围 从第一行到第三行
#sed -n '1,3p' passwd
2,+4 匹配行后若干行
4,~3 从第四行到下一个 3 的倍数行
1~3 第一行起每间隔三行的行
$ 尾行
1! 除了第一行以外的行
正则:
正则必须用 // 包裹起来
扩展正则需要用 -r 参数或转移
- # 范例:
- #cat file.txt
- .TS
- Beijing,CN
- .TE
- Shanghai,CN
- guangzhou,CN
- shenyang,CN
- #sed '/Beijing/s/CN/China/' file.txt
- # 删除所有的行
- #d
- # 只删除第一行
- #1d
- # 使用寻址符号 $, 删除最后一行
- #$d
- # 删除空行, 正则表达式必须封闭在斜杠 // 当中
- #/^$/d
- # 删除. TS 和. TE 标记的 tbl 输入
- #/^.TS/,/^.TE/d
- # 删除第五行到结尾所有的行
- #5,$d
- # 混合使用行地址和模式地址
- #sed '1,/^$/d' file.txt
- # 删除除了那些行以外的行
- #1,5!d
- # 分组命令
- /^.TS/,/^.TE/{
- s/CN/China/
- s/Beijing/BJ/
- }
sed '2,3s{/cn/china/;s/a/b/}' file.txt 同一范围的两个替换可以用大括号括起来一起, 中间加分号
# 函数:
增删改:
a 后插
c 替换
i 前插
d 删除模式空间的所有内容, 并接着读入下一行到模式空间
# 替换:[address ]s/pattern /replacement /flags
标志 flags 是:
n 可以是 1-512, 表示第 n 次出现的情况进行替换
g 全局更改
p 打印模式空间的内容
w file 写入到一个文件 file 中
i 忽略大小写
- [root@wing ~]# echo Aaaaba | sed -r 's/a./B/'
- AB
- [root@wing ~]# echo Aaaaba | sed -r 's/a./B/i'
- B
s 字符串替换 s/old/new/
- # 替换的时候可以把 / 换成其他的符号, 比如 =
- #sed -n 's/root/ABCDEF/p' /etc/passwd
- ABCDEF:x:0:0:root:/root:/bin/bash
replacement 部分用下列字符会有特殊含义:
& 用正则表达式匹配的内容进行替换
\n 回调参数
\(\) 保存被匹配的字符以备反向引用 \ N 时使用, 最多 9 个标签 标签顺序从左至右
- #cat test1
- first:second
- one:two
- #sed 's/\(.*\):\(.*\)/\2:\1/' test1
- second:first
- two:one
y 字符替换 (变形) y 是替换整个字符串 s 也可以但是 s 是一个一个匹配的
r 从文件中读入内容到指定行的后面
- #sed'2r b.txt' a.txt 将 b.txt 文件内容读入到文件 a.txt 的第 2 行后面
- # 工作模式: 模式空间和保持空间介绍
模式空间: 初始化为空, 处理完一行后会自动输出到屏幕并清除模式空间.
: 将符合内容进行更改 将更改的内容作为下一个的要更改的内容
: 将第一行处理完后 将处理过的内容 打印出来, 将模式空间清楚 换第二行来处理
# 置换: 模式空间和保持空间 (暂存空间)
h 把模式空间内容覆盖到保持空间中
H 把模式空间内容追加到保持空间中
g 把保持空间内容覆盖到模式空间中
G 把保持空间内容追加到模式空间中
x 交换模式空间与保持空间的内容
d 删除模式空间的所有内容, 并接着读入下一行到模式空间
颠倒输出 直接用 tac 就可以颠倒
$ sed '1!G;h;$!d' rev.txt
xyz
def
abc
$
详解
1!G;h;$!d
文本
1
2
3
模式空间 保持空间
第一行 1 1 后边将覆盖
第二行 2 2 后边将覆盖
1 1
第三行 3 3
- 2 2
- 1 1
- #cat passwd |tac
- :wq
- 1
- 1
- 1
- 1
- 1
- o
- xiaomi:x:1000:1000:xiaomi:/home/xiaomi:/bin/bash
- tcpdump:x:72:72::/:/sbin/nologin
- sync:x:5:0:sync:/sbin:/bin/sync
- lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
- emon:x:2:2:daemon:/sbin:/sbin/nologin
- # cat test.sh
- 1111111
- 2222222
- 3333333
- 4444444
- # sed '{1h;2,3H;4G}' ./test.sh
- 1111111
- 2222222
- 3333333
- 4444444
- 1111111
- 2222222
- 3333333
# sed '{1h;2x;3g;$G}' ./test.sh
- 1111111
- 1111111
- 2222222
- 4444444
- 2222222
保持空间: 相当于粘贴板 里边内容不会主动被清空
保持空间: 初始化为一个空行, 也就是默认带一个 \ n, 处理完后不会自动清除.
# 控制流
! 命令取反 例: 1!d 删除第一行以外的行
{} 命令组合 命令用分号分隔 {1h;G} 可以理解为 -e 参数的另一种写法
= 打印行号 (输入行的号码, 而非处理的次数行号) 例如: sed -n '2{=;p}' infile
n 读入下一行到模式空间 例:'4{n;d}' 删除第 5 行
N 而是追加下一行到模式空间, 再把当前行和下一行同时应用后面的命令
P 输出多行模式空间的第一部分, 直到第一个嵌入的换行符为止. 在执行完脚本的最后一个命令之后, 模式空间的内容自动输出.
P 命令经常出现在 N 命令之后和 D 命令之前.
D 删除模式空间中直到第一个换行符的内容. 它不会导致读入新的输入行, 相反, 它返回到脚本的顶端, 将这些指令应用与模式空间剩余的内容.
这三个命令能建立一个输入, 输出循环, 用来维护两行模式空间, 但是一次只输出一行.
这个循环的目的是只输出模式空间的第一行, 然后返回到脚本的顶端将所有的命令应用于模式空间的第二行. 没有这个循环, 当执行脚本中的最后一个命令时, 模式空间中的这两行都将被输出.
- # tac 将文本内容倒过来
- # cat a.txt |tac
删除文件倒数第二行
#sed 'N;$!P;D' a.txt
N 将下一行追加到模式空间中 现在模式空间中会有 第一行和第二行
交给 P 来进行 P 将 第一行输出 出来
交给 D 来进行 D 将 第一行删除 然后重新执行子命令 然后在来一边
这样循环如果只有 N;P;D 内容将不会该变什么 因为他可以循环到底
在 p 前边加 $! 是为了取反 执行最后一行之外的行 N 将最后一行和倒数第二行放里边了
P 执行时 不执行最后一行直接略过交给 D 执行 然后他把第一行删除掉 内容中的第二行就被删除了
然后再循环一次 因为后边没有内容了 N 不再执行 P 将第一行输出 粘贴板没有内容了 D 也不执行
删除文件最后两行
sed 'N;$!P;$!D;$d' a.txt
练习:
将第一行插入到每个偶数行的后面
$ sed '1h;0~2G' a.txt
- 11111111
- 22222222
- 11111111
- 33333333
- 44444444
- 11111111
- 55555555
- 66666666
- 11111111
- # 脚本方法
-f 参数 引用脚本 (脚本的末尾不能有空格制表符或其他文本)
- cat sed.sh
- 2,4d
- s/777/seker/
- s/999/seker&seker/
- # sed -f sed.sh test.txt
- 1111111
- 5555555
- 6666666
- seker7777
- 8888888
- seker999seker9999
- # 在脚本中指明解释器为 sed
- cat sed.sh
- #!/bin/sed -f
- 2,4d
- s/777/seker/
- s/999/seker&seker/
来源: http://www.bubuko.com/infodetail-2586277.html