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}