sed编辑器基础
sed编辑器基础
实现自动格式化,插入,修改或删除文本元素的简单命令行编辑器sed(stream editor)
提供了一组规则编辑数据流
- 从命令行输入
- 命令文件中
特定:一次从数据中读取一行数据,将一行数据作为对象
按模式匹配,按命令修改。
sed [option] script file
-e script
将命令添加到已有命令中
-f file
将file中的命令添加到已有命令中
-n
不产出命令输出
在命令行定义
默认情况下,sed命令会被应用到STDIN中
echo "This is a test" | sed 's/test/big test/'
命令行使用多个命令时,使用-e选项,且使用分号隔开各个命令:
sed -e 's/brown/green/; s/dog/cat/' data.txt
次提示符:
sed -e '
s/brown/green/
s/dog/cat/
s/fox/elephant/' data.txt
从文件读取命令
sed -f script.sed data.txt
替换s
s/old words/newwords/
替换标记
- 数字标记:表明新文本将替换第N处模式匹配的地方
- g:表明新文本将会替换所有匹配的文本
- p:表明原先行的内容要打印出来( -n选项将禁止sed输出,但p替换标记会输出修改的行。)
- w file:将替换的结果写到指定的文件中( sed的正常输出是在STDOUT中,只有匹配模式的行才会输出到文件)
替换字符(/ -> 其它符号)
sed 's/\/bin\/bash/\/bin/\/csh/' /etc/passwd
->sed 's-/bin/bash-/bin/csh-' /etc/passwd
使用地址
[address] command
- 数字形式
sed '2s/dog/cat/' data.txt
sed '2,3s/dog/cat/' data.txt
sed '2,$s/dog/cat/' data.txt
- 文本模式过滤
pattern/command
(用正斜线将pattern封装起来)
- 命令组合
$ sed '3,${
> s/brown/green/
> s/lazy/active/
> }' data.txt
可以将特定地址的多个命令分组:
address{command1; command2; command3; }
删除行d
[address]d寻址+删除
使用两个匹配模式删除中间行(包括指定行),第一个模式打开删除功能,第二个关闭删除功能
插入i/附加a 文本
sed '[address]command\
new line' filedata
可以匹配行号与文本模式,不能用地址区间
要使对象为多行文本,每行都要使用反斜线
修改行c
sed '[address]c\
This line is changed' filedata
多行地址区间会被新对象替换
转换y
是唯一可以处理单字符的sed编辑器命令
[address]y/inchars/outchars/
inchars与outchars进行一对一映射
sed 'y/123/789/' data.txt
全局命令,地址区间文本都会转换,而不考虑它们出现的位置
打印p
- p命令用来打印文本行
- =命令用来打印文本行
- l 列出行
P:只是打印文件内容。常用来和-n选项共同作用来打印匹配的行
=:打印行号
l:打印数据中不可见的ASCII字符(同标准C一致)
使用sed处理文件
- 写入文件
[address] w file
将匹配区间打印到指定文件
- 从文件读取
[address] r filename
将指定文件中的文本插入到指定地址后
sed '/List/{r NameFile; d}' data.txt
即读取+删除=替换
将NameFile中的数据插入到List行之后,然后删除List行
多行命令
用于处理分布在多行之中的文本
- N:将数据流中的下一行加起来创建一个多行组
- D:删除多行组中的一行
- P:打印多行组中的一行
单行文本中的n
命令
匹配某行文本之后,next到下一行处理命令。即将下一行文本移到sed的工作空间
多行版本的N
命令
将下一行文本添加到工作空间中已有的文本行之后(仍然使用换行符分割),但sed命令会将这些文本当作一行处理
(由于N处理多行,在处理最后一行时没有可处理的行就停止了,可以用单行命令在N之前,多行命令放到N命令之后)
D
删除模式空间中第一个换行符之前的文本
d
会将模式空间中的所用文本删除
P
打印模式空间中第一个换行符之前的文本
p
会将模式空间中的所用文本打印
保持空间
- h:模式空间的文本复制到保持空间
- H:模式空间的文本附加到保持空间
- g:保持空间的文本复制到模式空间
- G:保持空间的文本附加到模式空间
- x:保持空间和模式空间交换内容
排除命令
匹配模式 !commands
匹配的文本不执行命令,其余文本执行命令
反序文本
sed -n '1!G; h; $p' data.txt
改变流
通常,sed会从脚本的顶部开始,一直执行到脚本结尾(D命令除外,它会强制sed编辑器返回到脚本顶部,而不读取新行)
分支b
[address] b [lable]
[lable] 定义跳转位置,以冒号开始,最多可以7个字符
测试t
如果测试成功,跳到标签处,没有标签的话,跳到脚本结尾
是一个低成本的if-then语句
模式替代&
指代了匹配模式匹配到的具体内容
替代单独的单词
使用圆括号指定子模式,得使用转义使括号成为特殊符号
sed 's/.(at)/he\1' data.txt
其中\1指代了子模式at
使用包装脚本
当脚本太长时,可以写个shell脚本,使其充当sed和命令行之间的中间人
#!/bin/bash
# 包装脚本
sed '/cat|dog/i\
The Next line have dog or cat' $1
重定向sed输出
前面说过,默认是STDOUT
可以在脚本中使用命令替换($()
/``)将输出重定向到变量中,以备后用。
sed实用工具
- 加倍行间距
sed '$!G' data.txt
保持空间中默认内容是空行
对可能包含空白行的文件加倍行距
sed '/^$/d; $!G' data.txt
- 给文件中的行编行号
sed '=' data.txt | sed 'N; s/\n/ /' data.txt
- 打印末尾行
sed -n '$p' data.txt
末尾几行(假设为10)
sed '{
:start
$q; N; 11,$D
b start
}' data.txt
- 删除行
- 连续的空白行
/./,/^$/!d
- 删除开头的空白行
/./,$!d
- 删除结尾的空白行
sed '{
:start
/\n*$/{$d;N;b start}
}' data.txt
- 删除HTML标签
sed 's/<[^>]*>//g'
2020/10/8