有关sed的运用
### SED工具的基础与高级应用 #### 一、SED简介 SED(Stream Editor)是一种强大的文本处理工具,常用于Linux/Unix系统中的文本编辑任务。它支持基础的文本模式匹配和复杂的文本替换功能,能够对文件进行批量修改,无需手动打开文件。SED的工作方式是逐行读取文件,并在内存中对其进行操作,最后将结果输出到标准输出或重定向到其他文件。 #### 二、SED的基本命令格式 SED的基本命令格式为: ``` sed [选项] '脚本' 文件名 ``` 其中,“脚本”可以是一系列命令的组合,用于定义如何处理文件中的每一行。 #### 三、SED常用命令解析 1. **-e 脚本**:指定一个或多个SED脚本执行。 - 示例:`sed -e 's/123/1234/' a.txt` - 解析:将文件a.txt中所有出现的“123”替换为“1234”。 2. **-f 文件**:从文件中读取SED脚本执行。 - 示例:`sed -f scriptfile a.txt` - 解析:执行scriptfile中的SED脚本,对a.txt文件进行相应的处理。 3. **-h**:显示帮助信息。 - 示例:`sed -h` - 解析:显示SED的帮助信息,包括可用选项和命令。 4. **-n**:安静模式,不打印任何输入行,除非有明确指令。 - 示例:`sed -n '3,5a 4' a.txt` - 解析:在第3行和第5行之间插入数字4,但不会自动打印输出。 5. **-V**:显示版本信息。 - 示例:`sed -V` - 解析:显示SED的版本信息。 6. **替换操作**:使用`s`命令来替换文本。 - 示例:`sed -e '1s/12/45/' a.txt` - 解析:只替换文件a.txt中第一行出现的第一个“12”为“45”。 7. **全局替换操作**:使用`g`标志进行全局替换。 - 示例:`sed -i "s/oldstring/newstring/g" $(grep oldstring -rl yourdir)` - 解析:递归地搜索yourdir目录下的所有文件,并将每个文件中的所有“oldstring”替换为“newstring”。 8. **打印特定行**:使用`p`命令打印特定行。 - 示例:`sed -n 's/^test/mytest/p' example.file` - 解析:只打印那些匹配正则表达式“^test”的行,并将其替换为“mytest”。 9. **变量引用**:使用`\1`等来引用括号内的子表达式。 - 示例:`sed -n 's/(love)able/\1rs/p' example.file` - 解析:查找包含“loveable”的行,并将它们替换为“lovers”,然后打印这些行。 10. **条件替换**:使用正则表达式进行条件替换。 - 示例:`sed '/love/,/unlove/s/$/wangpan/' example.file` - 解析:在从包含“love”的行到包含“unlove”的行之间的所有行末尾添加“wangpan”。 11. **删除指定行**:使用`d`命令删除行。 - 示例:`sed -e '11,53d' -e 's/wang/pan/' example.file` - 解析:首先删除第11行到第53行,然后将所有“wang”替换为“pan”。 12. **多命令组合**:使用`-e`选项组合多个命令。 - 示例:`sed -e '/test/h' -e '/wangpan/x' example.file` - 解析:首先将包含“test”的行保存到模式空间中,然后删除包含“wangpan”的行。 13. **读取外部文件**:使用`r`命令读取外部文件内容。 - 示例:`sed '/wangpan/r file' example.file` - 解析:如果当前行包含“wangpan”,则读取file的内容并追加到该行后面。 14. **写入文件**:使用`w`命令将行写入到另一个文件。 - 示例:`sed -n '/test/w file' example.file` - 解析:将所有包含“test”的行写入到file文件中,而不打印这些行。 15. **插入行**:使用`i`命令在匹配行前插入一行。 - 示例:`sed '/test/i oh!Mygod!' example.file` - 解析:在包含“test”的行之前插入“oh!Mygod!”这一行。 16. **追加行**:使用`a`命令在匹配行后追加一行。 - 示例:`sed '/^test/a oh!Mygod!' example.file` - 解析:在以“test”开头的行之后插入“oh!Mygod!”这一行。 17. **执行多次命令**:使用`;`分隔多个命令。 - 示例:`sed '/test/{n; s/aa/bb/;}' example.file` - 解析:对于包含“test”的行,先获取下一行,然后将该行中的所有“aa”替换为“bb”。 18. **字符替换**:使用`y`命令替换字符。 - 示例:`sed '1,10y/abcde/ABCDE/' example.file` - 解析:将文件example.file中第1行至第10行中的所有“abcde”替换为“ABCDE”。 19. **直接修改文件**:使用`-i`选项直接修改文件。 - 示例:`sed -i 's/now/rightnow/g' test_sed_command.txt` - 解析:将文件test_sed_command.txt中的所有“now”替换为“rightnow”,并直接修改文件内容。 20. **退出命令**:使用`q`命令提前结束处理。 - 示例:`sed '2q' test_sed_command.txt` - 解析:只打印前两行后即退出,不再继续处理文件。 21. **条件存储和检索**:使用`h`和`H`命令存储内容,`G`和`g`命令检索内容。 - 示例:`sed -e '/old/h' -e '/girl-friend/G' test_sed_command.txt` - 解析:当遇到含有“old”的行时,将其保存到模式空间中;当遇到含有“girl-friend”的行时,将之前保存的内容附加到该行后面。 通过上述命令的介绍,我们可以看出SED的功能非常强大,不仅可以进行简单的文本替换,还能进行更复杂的文本处理任务。掌握SED的基本用法和高级技巧对于系统管理员和开发人员来说都是非常有用的技能。