Sed 忽略三次回跳
我想换一个Sed 忽略三次回跳,sed,backticks,Sed,Backticks,我想换一个 ```javascript something ``` 与 现在,当我在带有javascript某物的文件上运行sed时(所有内容都在同一行中,没有新行) 它输出我想要的:{code}javascript a23231{code} 但是,当我使用一个包含新行的文件运行sed时,它不能正常运行。 我试图用\来显示反勾号,但这不是我想要的输出 我做错了什么?默认情况下sed一次只操作一行(基于换行符)。有很多方法可以改变这一点,但是如果您可以在一行中有多个匹配项(非贪婪匹配),那么pe
```javascript
something
```
与
现在,当我在带有javascript某物的文件上运行sed时(所有内容都在同一行中,没有新行)
它输出我想要的:{code}javascript a23231{code}
但是,当我使用一个包含新行的文件运行sed时,它不能正常运行。
我试图用\来显示反勾号,但这不是我想要的输出
我做错了什么?默认情况下sed
一次只操作一行(基于换行符)。有很多方法可以改变这一点,但是如果您可以在一行中有多个匹配项(非贪婪匹配),那么perl
将更适合
-0777
将整个输入文件拖成一个字符串
`(.**?``
将尽可能少地匹配回勾代码段
{code}$1\{code}
所需的替换,$1
将具有与捕获组匹配的文本
- 由于某种原因,
{}
导致替换部分出现问题,这就是第二个{
被转义的原因。我认为这与哈希
语法冲突
s
标志需要允许
也匹配换行符
- 如果需要就地编辑,请使用
-i
选项
如果-z
选项可用且三个反勾号之间的内容不能有反勾号,则使用sed
:
$ 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字符,则此解决方案将不起作用
Edit:刚刚意识到一个简单的sed的/`/{code}/如果输入像这里使用的示例一样格式良好,那么g'ip.txt也可以工作。谢谢您的回答,使用perl比让sed在多行上运行更容易吗?perl
更灵活,但是sed-z
如果满足answer@PedroGonzalez真的zed说sed的/`/{code}/g'ip.txt
可能也适用于您
sed -e 's/```\(.*\)```/{code}\1{code}/' sedfile
$ 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}
$ sed -zE 's/```([^`]+)```/{code}\1{code}/g' ip.txt
foo {code}xyz{code} baz {code}javascript 123{code}
{code}javascript
something
{code}