【发布时间】:2012-11-08 16:48:54
【问题描述】:
我怎样才能像这样转换 cmets
{{{
abc
def
}}}
降价cmets之类的
abc
def
(每行开头4个空格)在vim或sed中?
我尝试了以下,但我没有得到第一行之后的空格:
:%s/{{{\n\(\_.*\)\n}}}/ \1/
【问题讨论】:
标签: vim replace sed newline multiline
我怎样才能像这样转换 cmets
{{{
abc
def
}}}
降价cmets之类的
abc
def
(每行开头4个空格)在vim或sed中?
我尝试了以下,但我没有得到第一行之后的空格:
:%s/{{{\n\(\_.*\)\n}}}/ \1/
【问题讨论】:
标签: vim replace sed newline multiline
使用 vim:
:g/{{{/,/}}}/le 4|d|/}}}/d
解释:
:g/{{{/ 在每一行上运行一个带有{{{ 模式的命令
,/}}}/le 4 从当前行左对齐到结尾 }}}
d删除当前行/}}}/d搜索匹配}}}的行并删除根据您的缩进设置,使用 > 而不是 le 4 可能是排序器。
如需更多帮助,请参阅
:h :g
:h range
:h :left
:h :d
【讨论】:
le,因为它会丢失缩进。我不确定如何使用 > 与 :g 范围。
+ex_extra 功能在编译时被禁用时,:left 不可用。这让我相信您的vim 是tiny 或small 版本。有关详细信息,请参阅:h version。你可以通过:echo has('ex_extra')测试ex_extra
:> 可能会很棘手,因为它将光标移动到最近移动的文本的底部,因此命令变为:g/{{{/.,/}}}/>|.d|?{{{?d。你是对的:left 会盲目地破坏缩进,但它会强制从行首开始 4 个空格。
d 之前的 . 在做什么?
.。点表示当前行,在这种情况下可以在没有. 的情况下推断。所以命令变成:g/{{{/.,/}}}/>|d|?{{{?d.
awk:
awk '/{{{/{l=1;next}/}}}/{l=0} l{print" "$0}' file.txt
或者不那么神秘:
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'
请注意,我在代码部分前后多加了一行,否则markdown将无法正确识别代码。
【讨论】:
sed -i~ '/^{{{/,/^}}}/{/^{{{\|}}}/d;s;\(^.*$\); \1;}' inFile
【讨论】:
' 丢失。
这可能对你有用(GNU sed):
sed '/^{{{/,/^}}}/{//d;s/^/ /}' file
【讨论】: