sed
(流编辑器)是一个功能强大的文本处理工具,尤其擅长对文件或输入流进行行级的搜索、替换和过滤。以下是一些复杂的sed
用法示例:
多命令脚本:
你可以使用-e
选项连接多个命令,或者将所有命令写在一个脚本文件中并使用-f
选项调用。sed -e 's/pattern1/replacement1/g' \ -e '/pattern2/d' \ -e '/^pattern3/{ h s//replacement3/ w outputfile g }' inputfile
上述命令做了三件事:
- 将所有
pattern1
替换为replacement1
。 - 删除包含
pattern2
的行。 - 对于以
pattern3
开始的行,备份当前行到临时缓冲区(hold space),然后执行替换操作,把结果写入outputfile
,最后恢复原行内容。
- 将所有
地址范围:
使用行号或正则表达式指定要作用的行范围。sed '5,10s/pattern/replacement/g' inputfile # 在第5行至第10行间替换模式 sed '/start_pattern/,/end_pattern/s/pattern/replacement/g' inputfile # 在从匹配 start_pattern 到 end_pattern 范围内的行进行替换
地址增量匹配:
可以按照特定步长匹配行。sed '1~3s/pattern/replacement/' inputfile # 每隔3行执行一次替换操作
读取外部数据进行替换:
r
命令可以读取另一个文件的内容并在特定位置插入。sed '/insert_point/r external_file' inputfile # 在匹配 insert_point 的行后插入 external_file 文件的内容
条件语句与分支结构:
sed
支持简单的逻辑控制,例如:sed '/condition/ { a new_line_content b skip_label } :skip_label other_commands...' inputfile
这里,当遇到满足
condition
的行时,会添加新行内容,并跳转到skip_label
标签处,从而跳过之后的部分命令。保持空间与交换:
h
(保存到hold space)、g
(从hold space获取内容)和x
(交换hold space与pattern space)可以用于复杂的数据交互。使用Hold缓冲区和标签实现更复杂的逻辑:
对于需要多次引用同一行内容的复杂操作,可以结合使用h
,g
,x
和标签来实现类似于程序循环的效果。脚本编写:
对于非常复杂的任务,你可能需要编写一个完整的sed
脚本文件,其中包含一系列命令和逻辑结构。
记住,sed
是基于行的工具,它并不直接支持跨行编辑。然而,通过巧妙地运用上述技术以及\n
在替换字符串中的使用,可以在一定程度上模拟跨行编辑。对于高度复杂的跨行需求,可能需要转向其他工具如awk
或Perl等。