sed 用自身和新行替换字符串

sed 用自身和新行替换字符串

我在 html 文件中多次出现以下字符串

<br> <h4 id=...

现在,我知道 sed 可能不适合 html 编辑,但可以告诉我如何
替换br> <h4 id
with (其中 '\n' 是新行; andbr>\n <h4 id之间有一个空格)?<br><h4...

我试过了sed 's/br> <h4 id/br> \n<h4 id/g' report.html,但没有成功。在这个 stackexchange 上,还有关于 sed 和新行替换的其他问题,但它们不适用于我的情况。谢谢你!

更新:我正在 Windows 机器上运行 Visual Studio Code bash 终端和 (Git) Bash (这是某种 MINGW64)

答案1

命令替换部分中的换行符s sed可移植地表示为\后跟换行符,因此:

sed 's/br> <h4 id/br>\
<h4 id/g' report.html

或者:

sed 's/\(br>\) \(<h4 id\)/\1\
\2/g' report.html

某些sed实现\n也允许这样做,但这是一个非标准扩展。

通过一些sh实现(并且可能会在 POSIX 标准的下一个主要版本中成为标准),您可以使用$'...'引号的形式(最初来自 ksh93),其中\n扩展为换行符(和\\反斜杠字符) 。因此,有了这些,你可以这样做:

sed $'s/\(br>\) \(<h4 id\)/\1\\\n\2/g' report.html

该标准的同一下一个版本还将引入选项-Esed来自 BSDsed来启用延长正则表达式允许您执行以下操作:

sed -E $'s/(br>) (<h4 id)/\1\\\n\2/g' report.html

答案2

尝试用

sed 's/br>[[:blank:]]*<h4 id/br> \n<h4 id/g'

br>和之间可能有多个空格<h4(或没有)。

相关内容