资讯动态

【shell编程知识点汇总】第九章 HTML 清洗、多行合并与条件替换

发布时间:2026/8/15 1:14:53 来源:尧图企业网站定制
目录一、HTML 标签清洗剥离尖括号内容二、多行合并N 命令与换行符替换三、逻辑取反! 的否定语义四、匹配整体引用 的替身魔法五、精准定位只输出最后一行六、地址限定替换条件化编辑总结速查表结语在文本处理中sed不仅是简单的查找替换工具更是能够处理结构化文本、执行条件逻辑的行级编辑器。本文针对六个高阶场景——从 HTML 标签清洗到地址限定替换——深入解析其内部机制帮助你日志分析、数据清洗和配置管理。一、HTML 标签清洗剥离尖括号内容问题sed s/[^]*//g这个正则模式主要用来去除什么解析这是 sed 中经典的HTML/XML 标签去除模式用于将文本中的所有 HTML 标签剥离仅保留纯文本内容。正则拆解模式含义匹配左尖括号标签起始[^]*匹配从当前位置开始一直到第一个之前的所有内容不含本身。匹配右尖括号标签结束//替换为空删除g全局标志处理行内所有标签工作原理[^]*是一个否定字符类它贪婪地匹配标签内的所有属性、样式和文本直到遇到第一个为止。配合g标志一行内出现的多个标签都会被依次移除。示例echo p classintroHello bWorld/b!/p | sed s/[^]*//g # 输出Hello World! #这里 s/[^]*//g把所有 HTML 标签替换成空字符串 #HTML 标签比如p、p classintro、b、/b、/p 全都能匹配到。⚠️ 注意事项此模式适用于简单、格式规范的 HTML。对于嵌套复杂、包含在属性值中如data-valab或跨行标签的情况sed 的单行处理能力可能力不从心此时建议使用专门的 HTML 解析器。二、多行合并N命令与换行符替换问题sed N; s/\n/ /其中的N命令和\n的替换实现了什么样的行操作解析该命令实现了将相邻的两行合并为一行并用空格替代原有的换行符。核心机制NNext将输入流的下一行追加到当前模式空间pattern space两行之间以换行符\n分隔s/\n/ /将模式空间中的换行符替换为空格完成行合并执行流程示例# 输入 # Hello # World sed N; s/\n/ / file.txt # 输出 # Hello World进阶理解N是 sed 处理多行模式空间的关键命令。默认情况下 sed 逐行处理但N允许你将多行加载到同一个模式空间进行跨行操作。类似的命令还有P打印模式空间中第一行到第一个\n为止D删除模式空间中第一行并重新开始循环循环合并多行如果需要将所有行合并为一行可以配合标签实现循环sed :a; N; s/\n/ /; ta file.txt #:a定义一个标签 a相当于循环的起点。三、逻辑取反!的否定语义问题sed /foo/!d file.txt中的感叹号!表示什么逻辑解析!表示逻辑取反negation即对不匹配地址的行执行后续命令。完整解读/foo/地址条件匹配包含字符串foo的行!否定该地址条件d删除命令因此/foo/!d的含义是删除所有不包含foo的行最终只保留包含foo的行。等价命令sed /foo/!d file.txt # 完全等价于 sed -n /foo/p file.txt #默认 sed 会输出所有行 #加 -n 只输出我们指定的行 #p print 打印匹配到的行!的通用性!可以应用于任何命令和地址组合例如sed 5!s/foo/bar/ # 除第5行外其他行中的 foo 替换为 bar sed $!d # 删除除最后一行外的所有行仅保留最后一行 #$ 匹配最后一行 ! 取反不是最后一行 d delete删除当前行四、匹配整体引用的替身魔法问题解释sed s/./ /g中符号代表什么内容解析在 sed 的替换字符串中表示整个正则表达式匹配到的完整文本即匹配模式的镜像。命令拆解.匹配任意单个字符包括空格、标点等在替换部分被替换为刚才匹配到的那个字符后面再加一个空格g全局执行对每行中每个字符都操作效果演示echo Hello | sed s/./ /g # 输出H e l l o的典型应用场景给匹配内容加标记echo price: 100 | sed s/[0-9]\/[]/ # 把文本里的第一个数字用方括号 [] 包起来。 # \匹配一个或多个 在 sed 里需要转义写成 \ # 引用匹配到的内容 # 输出price: [100]重复匹配内容echo abc | sed s/.*/ / # 输出abc abc # .*正则匹配整行所有字符与反向引用的区别引用整个匹配串\1,\2...引用捕获组括号内的部分五、精准定位只输出最后一行问题sed -n $p file.txt只会输出文件的哪一部分解析该命令仅输出文件的最后一行。符号解析符号含义-n静默模式抑制默认的逐行打印行为$特殊地址代表最后一行Last Linep显式打印命令工作流程sed 逐行读取文件-n确保不自动输出任何内容。当读取到最后一行时$地址匹配成功触发p命令将其打印。等效命令对比sed -n $p file.txt # sed 方式 tail -n 1 file.txt # tail 方式 awk END{print} file.txt # awk 方式扩展倒数第 N 行sed 本身没有直接支持倒数第 N 行的内置地址但可以通过保持空间hold space或结合其他命令实现# 输出倒数第3行 sed -n :a; N; 4,$D; ba file.txt-n安静模式不自动输出任何行。:a定义一个标签 a循环的起点。N读取下一行追加到模式空间缓冲区。4,$D4,$从第 4 行到最后一行D删除模式空间第一行意思只要缓冲区里 ≥4 行就删掉最旧的那一行ba无条件跳回标签 a继续循环。读第 1 行 → 缓存[1]读第 2 行 → 缓存[1,2]读第 3 行 → 缓存[1,2,3]读第 4 行 → 缓存≥4 行 →删第 1 行→ 缓存[2,3,4]读第 5 行 → 缓存≥4 行 →删第 2 行→ 缓存[3,4,5]... 一直到文件结束最后缓存里剩下的就是最后 3 行六、地址限定替换条件化编辑问题在sed /Error/s/False/True/中替换操作s是在所有行执行还是受限于前面的地址解析替换操作受限于前面的地址只有匹配/Error/的行才会执行s/False/True/。地址-命令结构sed 的命令格式为[address[,address]]command。当命令前带有地址时该命令仅对地址匹配的行生效。执行逻辑sed 逐行读取输入检查当前行是否包含字符串Error如果包含执行s/False/True/将该行中的False替换为True如果不包含跳过s命令该行原样输出除非有其他命令示例演示# 输入 # Status: OK, Result: False # Status: Error, Result: False # Status: Warning, Result: False sed /Error/s/False/True/ file.txt # 输出 # Status: OK, Result: False # Status: Error, Result: True # Status: Warning, Result: False复合地址应用地址限定可以与范围、正则、行号灵活组合sed 5,10s/foo/bar/ # 仅第5到10行执行替换 sed /BEGIN/,/END/s/x/y/ # 仅BEGIN到END范围内的行执行替换 sed /^#/!s/^/ / # 对非注释行缩进两个空格 # /^#/匹配以 # 开头的注释行 # !取反 → 不是注释行 # s/^/ /行首插入两个空格总结速查表问题核心知识点一句话总结1s/[^]*//g删除 HTML/XML 标签提取纯文本2N; s/\n/ /加载下一行到模式空间将换行转为空格合并行3/foo/!d!取反只保留匹配行删除其余行4s/./ /g代表完整匹配串给每个字符后加空格5-n $p-n配合$p精确输出文件最后一行6/Error/s/.../地址限定命令作用域仅匹配行执行替换结语sed 的魅力在于其地址-命令模型的简洁与强大。通过地址筛选目标行再通过命令执行精确编辑这种先定位、后操作的范式使得 sed 在处理日志过滤、配置修改、数据格式化等任务时极为高效。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价