目录
前言
sed(stream editor)是一个非交互性文本流编辑器。它编辑文件或标准输入导出的文本拷贝。标准输入可能是来自键盘、文件重定向、字符串或变量,或者是一个管道的文本。
功能
Linux SED逐行处理。文件的每一行都被单独读取处理,然后再次输出。SED最重要的功能是在文件中搜索某些字符串,然后用其他字符替换它们。
命令语法
不管是使用shell命令行方式或脚本文件方式,如果没有指定输入文件,sed从标准输入中接受输入,一般是键盘或重定向结果。
sed [Option(s)] 'Command(s)' [File(s)]
- options 选项
- Commands sed命令
- Files 输入文件
选项:options
选项 | 描述 |
---|---|
-e | 指定 |
-f | 从文件中读取sed命令 |
-n | 不输出 |
-i | in-place:直接修改文件内容 |
-u | 从输入文件加载最小数量的数据并更频繁地刷新输出缓冲器 |
-r | 在脚本中使用扩展正则表达式 |
命令:Commands
模式空间(pattern space):模式空间是 sed 处理文本时所使用的主要缓冲区。它会读入一行文本,并在其中进行编辑操作。当 sed 处理完一行文本后,它会将该行文本输出到标准输出并清空模式空间,然后读取下一行文本。
保留空间(hold space):是一个额外的缓冲区,可以在 sed 命令执行过程中存储额外的文本。
可以使用 sed 命令的 "h" 和 "H" 命令将 pattern space 中的文本复制到 hold space 中。可以使用 "g" 和 "G" 命令将 hold space 中的文本复制到 pattern space 中。
命令 | 描述 |
---|---|
a | append:追加文本 |
i | insert:插入文本,在所选的行前插入一行或多行文本 |
l | listing:显示所有不可打印的标志 |
c | change:将新的文本替代所选择的行 |
d | delete:删除所选择的行 |
g | get:将内容从保留空间复制到模式空间 |
G | GetNewline:将保留空间中的内容粘贴到模式空间中 |
h | hold:将内容从模式空间复制到保留空间 |
H | HoldNewLine:将内容从模式空间粘贴到保留空间。 |
n | next:读取下一行的文本到模式空间 |
p | print:打印当前的模式空间 |
q | quit:退出LINUX Sed |
r | read:追加从文件读取的文本 |
s | substitute:用一个特定的文本替代模式空间的内容 |
x | exchange:交换保留空间与模式空间的文本内容 |
y | yank:将特定的文本替换模式空间的内容 |
w | write:将当前模式空间的第一行开始的内容写入文件 |
文本位置:address
在 Linux 的 sed 命令中,address 是指定要操作的文本的位置。 sed 命令可以根据不同的 address 来执行不同的操作。常见的 address 有:
-
行号地址: 以数字开头,表示要操作的行号。例如,/^/表示匹配每一行的开头。
-
正则表达式地址: 以斜杠开头,后面跟着一个正则表达式。例如,/^\\s*\\S+/表示匹配每一行的开头,后面跟着零个或多个空格,然后是一个或多个非空格字符。
-
范围地址: 以数字和逗号开头,表示要操作的行号范围。例如,1,5表示操作第1行到第5行。
-
模式地址: 以斜杠和模式开头,表示要操作的模式。例如,/pattern/表示匹配包含"pattern"的行。 sed 命令可以根据不同的 address 来执行不同的操作,例如替换、删除、插入等。
sed编程举例
假定以下例子的输入文件名为:test.txt,文件内容如下:
hello world,this is a test.
sed is a stream editor.
Linux SED proceeds line by line.
The SED command works with commands and is applied to files.
the tool is mainly used in shell programming
1 替换文件中的字符串
使用sed命令可以将"hello world"字符串替换为"hi there",命令如下:
sed -i 's/hello world/hi there/g' test.txt
其中,-i选项表示直接修改原文件,s表示替换操作,/hello world/表示要被替换的字符串,/hi there/表示替换后的字符串,g表示全局替换。
输出:
2 删除文件中的行
使用sed命令可以删除其中的某一行,例如删除第5行,命令如下:
sed -i '5d' test.txt
其中,5d表示删除第5行
输出:
3 在文件中插入内容
使用sed命令可以在其中插入一行文本,例如在第3行后插入一行"new line",命令如下:
sed -i '3anew line' test.txt
其中,-i选项表示直接修改原文件,3a表示在第3行后插入,new line表示要插入的文本。
输出:
4 显示整个文件
使用如下命令
sed -n '1,$p' test.txt
其中,$为最后一行
输出:
5 从文件中提取特定行
使用sed命令可以提取其中的某几行,例如提取第3到第5行,命令如下:
sed -n '3,5p' test.txt
其中,-n选项表示只输出匹配的行,3,5表示要提取的行的范围,p表示打印匹配的行。、
输出:
6 使用脚本文件进行文本处理
我们可以创建一个名为test.sed的脚本文件,包含以下内容:
s/SED/stream editor/g
这个脚本的意思是将test.txt中所有的"SED"替换为"stream editor"。现在我们可以使用sed命令,并使用-f参数指定test.sed作为脚本文件:
执行如下命令:
sed -f test.sed test.txt
输出: