如何解决sed忽略三引号
我要替换
```javascript
something
```
使用
{code}javascript
something
{code}
现在,当我使用javascript something
对文件运行sed时(所有内容都在同一行中,没有新行)
sed -e 's/```\(.*\)```/{code}\1{code}/' sedfile
它输出我想要的:{code}javascript a23231 {code}
但是,当我使用包含新行的文件运行sed时,它做得不好。
我尝试使用\来分隔反引号,但它不是我想要的输出。
我在做什么错了?
解决方法
默认情况下,sed
一次仅操作一行(基于换行符)。可以通过多种方法进行更改,但是如果您可以在一行中有多个匹配项(非贪婪匹配项),则perl
会更适合
$ cat ip.txt
foo ```xyz``` baz ```javascript 123```
```javascript
something
```
$ perl -0777 -pe 's/```(.*?)```/{code}$1\{code}/gs' ip.txt
foo {code}xyz{code} baz {code}javascript 123{code}
{code}javascript
something
{code}
-
-0777
将整个输入文件包含为单个字符串 -
```(.*?)```
将尽可能地匹配反引号摘要 -
{code}$1\{code}
所需的替换,$1
的文本将与捕获组匹配- 由于某些原因,
{}
导致替换部分出现问题,这就是第二个{
被转义的原因。我认为这与hash
语法引起冲突
- 由于某些原因,
-
s
标志是必需的,以允许.
也匹配换行符 - 如果需要就地编辑,请使用
-i
选项
使用sed
(如果-z
选项可用,并且三个反引号之间的内容不能反引号:
$ sed -zE 's/```([^`]+)```/{code}\1{code}/g' ip.txt
foo {code}xyz{code} baz {code}javascript 123{code}
{code}javascript
something
{code}
-z
选项使sed
使用ASCII NUL而不是换行符作为分隔符。如果输入文件具有NUL字符,则此解决方案将不起作用。
编辑:刚刚意识到,如果输入格式正确(如此处使用的示例),则简单的sed 's/```/{code}/g' ip.txt
也可以使用。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。