如何使用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