原文链接:【命令操作】Linux三剑客之sed详解 | 统信 | 麒麟 | 方德
Hello,大家好啊!今天带来一篇关于Linux三剑客之sed命令详解的文章。sed是一款功能强大的流编辑器,它可以在命令行中快速处理文本,支持替换、插入、删除等操作,特别适合用于处理大型文件或批量文本处理任务。
本文将详细介绍sed命令的使用方法及其实际应用场景,帮助大家更好地掌握这款灵活的文本处理工具!欢迎大家分享转发,点个关注和在看吧!
什么是sed命令?
sed(Stream Editor)是一款流式文本处理工具,能够逐行读取文件或输入流,对文本内容进行编辑。sed的常见用途包括文本替换、删除、插入以及数据提取等。它的强大之处在于能够直接在命令行进行快速的文本处理,而不需要打开编辑器。
1.基本语法
sed [选项] '命令' 文件名
sed会逐行读取文件或标准输入,执行指定的命令后输出结果,默认情况下不修改原文件。
2.基本用法
查看文件内容:
pdsyw@pdsyw-PC:~/Desktop$ sed '' pdsyw.txt
不加任何命令,直接显示文件内容。
替换文本:
pdsyw@pdsyw-PC:~/Desktop$ sed 's/Bob/Tom/' pdsyw.txt
s表示替换操作。该命令会将每行中第一个匹配的Bob替换为Tom,并输出结果。
全局替换:
pdsyw@pdsyw-PC:~/Desktop$ sed 's/Bob/Tom/g' pdsyw.txt
在每行中替换所有匹配的Bob。
替换并保存到文件(-i选项):
pdsyw@pdsyw-PC:~/Desktop$ sed -i 's/Bob/Tom/g' pdsyw.txt
使用-i选项,直接修改文件内容。
3.常用选项
-i:直接修改文件,不输出结果到终端。
pdsyw@pdsyw-PC:~/Desktop$ sed -i 's/Tom/Bob/g' pdsyw.txt
-e:执行多条sed命令。
pdsyw@pdsyw-PC:~/Desktop$ sed -e 's/Bob/Tom/' -e 's/Alice/Nana/' pdsyw.txt
一次性执行多个sed命令。
-n:禁止默认输出,仅输出匹配的内容。
pdsyw@pdsyw-PC:~/Desktop$ sed -n 's/Bob/Tom/p' pdsyw.txt
-n会禁用默认输出,使用p命令只输出替换后的行。
4.进阶替换操作
限定范围替换:
pdsyw@pdsyw-PC:~/Desktop$ sed '1,3s/Bob/Tom/' pdsyw.txt
仅在第1到第3行之间替换Bob为Tom。
在指定行中替换:
pdsyw@pdsyw-PC:~/Desktop$ sed '2s/Bob/Tom/' pdsyw.txt
仅在第2行替换Bob为Tom。
正则表达式替换:
pdsyw@pdsyw-PC:~/Desktop$ sed 's/[0-9]/#/g' pdsyw.txt
将文件中的所有数字替换为#。
在替换中使用捕获组:
pdsyw@pdsyw-PC:~/Desktop$ echo "Hello 123" | sed 's/\(Hello\) \(123\)/\2 \1/'
输出123 Hello。\1和\2表示捕获的第一组和第二组内容。
5.删除文本
删除指定行:
pdsyw@pdsyw-PC:~/Desktop$ sed '2d' pdsyw.txt
删除第2行内容。
删除特定范围的行:
pdsyw@pdsyw-PC:~/Desktop$ sed '3,5d' pdsyw.txt
删除第3到第5行的内容。
删除匹配特定模式的行:
pdsyw@pdsyw-PC:~/Desktop$ sed '/Bob/d' pdsyw.txt
删除包含Bob的所有行。
删除空行:
pdsyw@pdsyw-PC:~/Desktop$ sed '/^$/d' pdsyw.txt
删除所有空行。^$表示空行的正则表达式。
6.插入和追加文本
在指定行前插入内容:
pdsyw@pdsyw-PC:~/Desktop$ sed '2i\This is inserted text' pdsyw.txt
在第2行前插入一行文本This is inserted text。
在指定行后追加内容:
pdsyw@pdsyw-PC:~/Desktop$ sed '2a\This is appended text' pdsyw.txt
在第2行后追加一行文本This is appended text。
在匹配行前插入内容:
pdsyw@pdsyw-PC:~/Desktop$ sed '/Bob/i\Inserted before Bob' pdsyw.txt
在匹配到Bob的行前插入文本。
在匹配行后追加内容:
pdsyw@pdsyw-PC:~/Desktop$ sed '/Bob/a\Appended after Bob' pdsyw.txt
在匹配到Bob的行后追加文本。
7.修改文本
替换整行:
pdsyw@pdsyw-PC:~/Desktop$ sed '2c\This is a new line' pdsyw.txt
将第2行替换为This is a new line。
替换匹配行:
pdsyw@pdsyw-PC:~/Desktop$ sed '/Bob/c\This line is replaced' pdsyw.txt
将包含Bob的行替换为This line is replaced。
8.显示和打印
打印指定行:
pdsyw@pdsyw-PC:~/Desktop$ sed -n '3p' pdsyw.txt
只显示第3行内容,-n禁止默认输出,p用于打印匹配的行。
打印特定范围的行:
pdsyw@pdsyw-PC:~/Desktop$ sed -n '3,5p' pdsyw.txt
显示第3到第5行内容。
打印匹配模式的行:
pdsyw@pdsyw-PC:~/Desktop$ sed -n '/Bob/p' pdsyw.txt
只打印包含Bob的行。
打印行号:
pdsyw@pdsyw-PC:~/Desktop$ sed '=' pdsyw.txt
输出文件内容的同时打印行号。
9.变量替换和环境变量
可以使用环境变量作为sed的替换内容:
pdsyw@pdsyw-PC:~/Desktop$ name=“Alice”
pdsyw@pdsyw-PC:~/Desktop$ sed “s/Bob/$name/g” pdsyw.txt
这会将pdsyw.txt文件中Bob替换为Alice。
10.使用正则表达式
基本正则表达式:
pdsyw@pdsyw-PC:~/Desktop$ sed -n ‘/1/p’ pdsyw.txt
输出以大写字母开头的行。^表示行首,[A-Z]表示大写字母。
匹配数字和字母组合:
pdsyw@pdsyw-PC:~/Desktop$ sed ‘s/[0-9]+/[数字]/g’ pdsyw.txt
将所有连续的数字替换为[数字]。
替换包含特殊字符的内容:
pdsyw@pdsyw-PC:~/Desktop$ sed ‘s//usr/local//opt/g’ pdsyw.txt
替换/usr/local为/opt。在sed中,斜杠/是分隔符,需要转义为/。
11.使用多个命令
使用-e选项:
pdsyw@pdsyw-PC:~/Desktop$ sed -e ‘s/Bob/Tom/’ -e ‘s/Alice/Nana/’ pdsyw.txt
使用-e指定多个命令。
使用分号分隔多个命令:
pdsyw@pdsyw-PC:~/Desktop$ sed ‘1d; s/Bob/Tom/g’ pdsyw.txt
删除第1行并将所有foo替换为bar。
在脚本文件中使用sed:
可以将多个sed命令写入脚本文件(例如script.sed):
pdsyw@pdsyw-PC:~/Desktop$ vim script.sed
pdsyw@pdsyw-PC:~/Desktop$ cat script.sed
script.sed
1d
s/Bob/Tom/g
然后执行:
pdsyw@pdsyw-PC:~/Desktop$ sed -f script.sed pdsyw.txt
12.sed常见使用场景
批量替换文件内容:
pdsyw@pdsyw-PC:~/Desktop$ sed -i ‘s/http:/https:/g’ *.html
将当前目录下所有.html文件中的http:替换为https:。
去除文件中的空白行:
pdsyw@pdsyw-PC:~/Desktop$ sed ‘/^$/d’ pdsyw.txt
删除所有空行。
批量删除文件中的HTML标签:
pdsyw@pdsyw-PC:~/Desktop$ sed ‘s/<[^>]*>//g’ pdsyw.txt
删除文件中的所有HTML标签。
提取日志文件中的错误信息:
root@pdsyw-PC:~# sed -n ‘/error/p’ /var/log/messages | head -1
打印包含error的日志行。
在文本文件开头插入多行内容:
pdsyw@pdsyw-PC:~/Desktop$ sed -i ‘1i\This is line 1\nThis is line 2’ pdsyw.txt
通过本文的介绍,大家应该已经掌握了sed命令的基本用法和各种应用场景。sed的强大功能使其在Linux文本处理领域中扮演了重要角色,特别是在批量替换、文件格式化和日志处理等方面,有着不可替代的优势。如果您觉得这篇文章对您有帮助,别忘了分享、转发,并记得点个关注和在看!感谢大家的阅读,我们下次再见!
A-Z ↩︎