sed - 如何用 sed 替换部分多行字符串
问题描述
我想用<br/>
不在三重反引号语句内的所有地方替换字符串中的换行符(```)
细绳:
This is some requirements just talking about c++ with
`char` types supported by C++:
```
using SecureString = BasicSecureString<char>;
using WSecureString = BasicSecureString<wchar_t>;
using U16SecureString = BasicSecureString<char16_t>;
using U32SecureString = BasicSecureString<char32_t>;
```
And continuing to write
stuff
预期结果:
This is some requirements just talking about c++ with<br/>`char` types supported by C++:<br/>```
using SecureString = BasicSecureString<char>;
using WSecureString = BasicSecureString<wchar_t>;
using U16SecureString = BasicSecureString<char16_t>;
using U32SecureString = BasicSecureString<char32_t>;
```<br/>And continuing to write<br/>stuff
我目前拥有的是这样的:
sed --null-data '/```.*```/!s/\n/<br\/>/g'
但它只适用于不包括反引号的输入。
有人有任何提示吗?
解决方案
有perl
或awk
perl -0777 -pe 's#```.*?```(*SKIP)(*F)|\n#<br/>#sg'
awk '/```/{f=!f} {ORS = f ? RS : "<br/>"} 1'
该perl
解决方案类似于您尝试使用的sed
.
-0777
将 slurp 整个输入文件,类似于sed -z
但-z
通过使用 ASCII NUL 作为行分隔符来工作```.*?```(*SKIP)(*F)
以防止此匹配部分被更改|\n
指定应该匹配的内容<br/>
替换字符串s
允许.
匹配换行符的标志
使用时,输出记录分隔符会根据输入具有三个反引号时awk
更改的值进行更改。f
这种方法的优点是不必对整个输入进行啜饮。
如果您不想更改文件中的最后一个换行符,请使用
perl -0777 -pe 's#```.*?```(*SKIP)(*F)|\n(?!\z)#<br/>#sg'
推荐阅读
- javascript - xterm.js - 获取当前行文本
- php - 在 PHP 中使用 sqlsrv 防止 SQL 注入
- node.js - 如何将 fetch 转换为 axios
- javascript - 如何禁用特定元素的上下文菜单?
- windows - 将文件从一个目录分组到另一个目录,文件名中具有特定模式
- java - JavaFX ScrollPane 不符合其约束
- javascript - Chrome 和 Firefox 中奇怪的控制台输出
- sql - 执行多个查询时,“psql -c”和“psql -f”有什么区别?
- css - firefox 使用“transform:rotate;”导致视觉伪影;
- azure - Terraform - 如何获取 azurerm 密钥保管库访问策略的应用服务对象 ID?