如何使用sed或vim将{{{…}}}转换为标记代码块?

如何使用sed或vim将{{{…}}}转换为标记代码块?,vim,replace,sed,newline,multiline,awk,Vim,Replace,Sed,Newline,Multiline,Awk,如何将注释转换为 {{{ abc def }}} abc def 降低评论的价格,如 {{{ abc def }}} abc def (每行开头有4个空格)在vim或sed中 我尝试了以下方法,但第一行之后没有空格: :%s/{{{\n\(\_.*\)\n}}}/ \1/ 与: 或者说不那么神秘: awk '/{{{/{l=1;next} /}}}/{l=0} l==1{print " " $0}' file.txt 假设文本中没有\r对象

如何将注释转换为

{{{
abc
def
}}}
    abc
    def
降低评论的价格,如

{{{
abc
def
}}}
    abc
    def
(每行开头有4个空格)在vim或sed中

我尝试了以下方法,但第一行之后没有空格:

:%s/{{{\n\(\_.*\)\n}}}/    \1/
与:

或者说不那么神秘:

awk '/{{{/{l=1;next} /}}}/{l=0} l==1{print "    " $0}' file.txt

假设文本中没有
\r
对象,您可以在
tr
的帮助下进行转换:

tr '\n' '\r' \
| sed 's/{{{/\r{{{/;
       s/}}}/}}}\r/;
       :w;
         s/\r{{{\r}}}//;
         s/{{{\r\([^\r]*\)\r\(.*\)}}}/    \1\r{{{\r\2}}}/;
       tw' \
| tr '\r' '\n'
请注意,我在代码部分前后添加了一行额外代码,否则标记将无法正确识别代码。

使用vim:

:g/{{{/,/}}}/le 4|d|/}}}/d
说明:

  • :g/{{{/
    在每一行上运行一个命令,模式为
    {{{
  • ,/}}/le 4
    从当前行到结尾的左对齐
    }
  • d
    删除当前行
  • /}}/d
    搜索匹配的行
    }
    并将其删除
根据您的缩进设置,使用
而不是
le 4
可能是分拣机

有关更多帮助,请参阅

:h :g
:h range
:h :left
:h :d
这可能适用于您(GNU-sed):


在此处运行,但您可能不想使用
le
,因为它将丢失缩进。我不知道如何在
:g
范围内使用
。根据文档:
:left
在编译时禁用
+ex_extra
功能时不可用。这使我相信您的
vim
tiny
small
版本。有关更多信息,请参见
:h版本
。您可以通过
:echo has('ex_extra')
@DanFitch:Using
:>
来测试
ex_extra
,使用
:>
可能很棘手b/c它会将光标移动到最近移动的文本的底部,因此命令变为:
g/{{{{{/}}}/}/>.d |{{{?d
。你是对的
:左
会盲目地破坏缩进,但它会从行的开始处强制4个空格。这真是太酷了,彼得,我必须研究它到底是如何工作的。在第一个
d
之前的
在做什么?@DanFitch:接得好!我忘了删除
。点repr表示当前行,在本例中可以在不使用
的情况下推断该行。因此,命令变为:
g/{{{{{/,/}}/>|d |?{{{d
。也有效!尽管它比其他解决方案稍长。@kirdie:closing
丢失。
sed '/^{{{/,/^}}}/{//d;s/^/    /}' file