如何用sed按匹配顺序将::替换为<b>或</b>(支持段落末尾)
解决文本中替换
::为<b>和</b>的问题 原命令的问题
你使用的sed命令s|::\(.*\)|\\<b>\1\\</b>|g存在两个核心问题:
- 默认
sed逐行处理,.*无法匹配换行符,导致跨行的内容无法被完整捕获; - 全局替换标记
g会把所有::都替换,不符合“第一个::换<b>、第二个::换</b>”的需求。
解决方案
方法1:使用sed处理跨行内容
通过将整个文件内容读入模式空间,实现跨行匹配并替换前两个:::
# 输出处理结果 sed -e '1h;1!H;$!d;g' -e 's/::/<b>/;s/::/<\/b>/' EntrenamientoProgresivoSamadhi # 原地修改文件(直接覆盖原文件) sed -i -e '1h;1!H;$!d;g' -e 's/::/<b>/;s/::/<\/b>/' EntrenamientoProgresivoSamadhi
命令解释:
1h;1!H;$!d;g:将整个文件内容合并为一个整体读入模式空间,解决跨行匹配问题;s/::/<b>/:替换第一个出现的::为<b>;s/::/<\/b>/:替换接下来第一个出现的::为</b>。
方法2:使用Perl更简洁处理
Perl默认支持跨行匹配,语法更直观:
# 输出处理结果 perl -0777 -pe 's/::(.*?)::/<b>$1<\/b>/s' EntrenamientoProgresivoSamadhi # 原地修改文件 perl -i -0777 -pe 's/::(.*?)::/<b>$1<\/b>/s' EntrenamientoProgresivoSamadhi
命令解释:
-0777:将整个文件作为单个字符串读取;s/::(.*?)::/<b>$1<\/b>/s:非贪婪匹配一对::之间的内容(包含换行),替换为对应的<b>标签;s修饰符让.匹配换行符。
内容的提问来源于stack exchange,提问作者Valentin Luque
相关产品推荐
相关产品推荐

