欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

sed编辑器基础

程序员文章站 2022-06-21 15:33:37
...

sed编辑器基础

实现自动格式化,插入,修改或删除文本元素的简单命令行编辑器sed(stream editor)

提供了一组规则编辑数据流

  1. 从命令行输入
  2. 命令文件中

特定:一次从数据中读取一行数据,将一行数据作为对象

按模式匹配,按命令修改。

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/

替换标记

  1. 数字标记:表明新文本将替换第N处模式匹配的地方
  2. g:表明新文本将会替换所有匹配的文本
  3. p:表明原先行的内容要打印出来( -n选项将禁止sed输出,但p替换标记会输出修改的行。)
  4. w file:将替换的结果写到指定的文件中( sed的正常输出是在STDOUT中,只有匹配模式的行才会输出到文件)

替换字符(/ -> 其它符号)

sed 's/\/bin\/bash/\/bin/\/csh/' /etc/passwd->sed 's-/bin/bash-/bin/csh-' /etc/passwd

使用地址

[address] command

  1. 数字形式

sed '2s/dog/cat/' data.txt

sed '2,3s/dog/cat/' data.txt

sed '2,$s/dog/cat/' data.txt

  1. 文本模式过滤

pattern/command (用正斜线将pattern封装起来)

  1. 命令组合

$ 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

  1. p命令用来打印文本行
  2. =命令用来打印文本行
  3. l 列出行

P:只是打印文件内容。常用来和-n选项共同作用来打印匹配的行

=:打印行号

l:打印数据中不可见的ASCII字符(同标准C一致)

使用sed处理文件

  1. 写入文件

[address] w file

将匹配区间打印到指定文件

  1. 从文件读取

[address] r filename

将指定文件中的文本插入到指定地址后

sed '/List/{r NameFile; d}' data.txt

即读取+删除=替换

将NameFile中的数据插入到List行之后,然后删除List行

多行命令

用于处理分布在多行之中的文本

  1. N:将数据流中的下一行加起来创建一个多行组
  2. D:删除多行组中的一行
  3. P:打印多行组中的一行

单行文本中的n命令

匹配某行文本之后,next到下一行处理命令。即将下一行文本移到sed的工作空间

多行版本的N命令

将下一行文本添加到工作空间中已有的文本行之后(仍然使用换行符分割),但sed命令会将这些文本当作一行处理

(由于N处理多行,在处理最后一行时没有可处理的行就停止了,可以用单行命令在N之前,多行命令放到N命令之后)

D 删除模式空间中第一个换行符之前的文本

d 会将模式空间中的所用文本删除

P 打印模式空间中第一个换行符之前的文本

p 会将模式空间中的所用文本打印

保持空间

  1. h:模式空间的文本复制到保持空间
  2. H:模式空间的文本附加到保持空间
  3. g:保持空间的文本复制到模式空间
  4. G:保持空间的文本附加到模式空间
  5. 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实用工具

  1. 加倍行间距

sed '$!G' data.txt

保持空间中默认内容是空行

对可能包含空白行的文件加倍行距

sed '/^$/d; $!G' data.txt

  1. 给文件中的行编行号

sed '=' data.txt | sed 'N; s/\n/ /' data.txt

  1. 打印末尾行

sed -n '$p' data.txt

末尾几行(假设为10)

sed '{

:start

$q; N; 11,$D

b start

}' data.txt

  1. 删除行
  • 连续的空白行

/./,/^$/!d

  • 删除开头的空白行

/./,$!d

  • 删除结尾的空白行

sed '{

:start

/\n*$/{$d;N;b start}

}' data.txt

  1. 删除HTML标签

sed 's/<[^>]*>//g'

2020/10/8

相关标签: 笔记 shell