Regex 使用sed缩进行范围?

Regex 使用sed缩进行范围?,regex,linux,sed,Regex,Linux,Sed,我在这里尝试使用sed将旧式phpBB代码块转换为MARKDOWN 请考虑以下数据样本: cat sed.txt [code]xxxx-YYY-xxxx[/code] Some text [code]yyyy-ZZZ-yyyy[/code] More text Bogus code block[/code] [code]zzzz-XXX-zzzz[/code] 经过长期的尝试和错误,我最终采用了以下策略: sed -ne ' /\[code\].*\[\/code\]/ { s#\[/

我在这里尝试使用
sed
将旧式
phpBB
代码块转换为
MARKDOWN

请考虑以下数据样本:

cat sed.txt
[code]xxxx-YYY-xxxx[/code]
Some text
[code]yyyy-ZZZ-yyyy[/code]
More text
Bogus code block[/code]
[code]zzzz-XXX-zzzz[/code]
经过长期的尝试和错误,我最终采用了以下策略:

sed -ne '
  /\[code\].*\[\/code\]/ {
  s#\[/*code\]##g
  s#^#\n\n    #
  s#$#\n\n#p
}' sed.txt | cat -Av
$
$
    xxxx-YYY-xxxx$
$
$
$
$
    yyyy-ZZZ-yyyy$
$
$
$
$
    zzzz-XXX-zzzz$
$
$
这非常有效,但我发现这样做更容易,也更自然:

sed -ne '
/\[code\].*\[\/code\]/ {
  s#\[/*code\]#\n\n#g
  s#^#    #p
}' sed.txt | cat -Av
    $
$
xxxx-YYY-xxxx$
$
$
    $
$
yyyy-ZZZ-yyyy$
$
$
    $
$
zzzz-XXX-zzzz$
$
$
但这并不像预期的那样有效。有什么建议吗?为什么,如何解决这个问题

多谢各位

sed '/\[code\].*\[\/code\]/ {
   s#\[code]#&    #g
   s#\[/*code\]#\
\
#g
   }' sed.txt
替换顺序很重要,在两个样品之间有所变化

我还改变了一些行为,
-n
p
在这个文本示例中是不需要的(但如果来自最大的结构,可能需要) (在我的aix so posix版本上测试)

这可能适合您(GNU-sed):


注意:在脚本中,在模式空间的开头加上2个换行符,然后再加上4个空格,因此缩进添加在第一个换行符的前面,而不是文本的前面

如我当前的策略代码示例所示。我只是不明白为什么其他代码示例会产生不同的结果-xxxx、yyyy、zzzz行没有缩进。这不会再现所需的结果,请注意,在匹配的一行上下各有2个空行。您的第一个示例通常缺少2个结束行(在我的系统上是这样的,并且sed指定$->\n\n所以结束是2个空行)。使用两个代码进行测试,在这里给出相同的结果。但是我忘记了范围过滤(添加到我的帖子中)好的,谢谢,现在它确实重现了期望的结果(替代方法,我在第一个代码示例中所做的)。但它仍然不能回答我的问题——为什么第二个代码示例不起作用,据我所知,它们应该是等效的。在我最初的帖子中,由于编辑时手指太胖,所以缺少了2行结尾,请查看更新版本。替换的周期不同,在上一个操作中,您在当前缓冲区的末尾添加了一个“`”,但不是在每行的末尾,因为缓冲区中至少有2行新行,你想念他们谢谢你让我走上了正确的道路。我终于弄明白了如何操纵模式和保持空间来获得相同的结果:
sed-nr'/\[code\].\[\/code\]/{s/\[\/*code\]///g;s/^//;h;s/*/\n/;g;s/(.*)/\1\n\n/};p'sed.txt | sed-nl
。我也接受了你的回答,因为它看起来是最优雅的。
sed -nr 's/^\[(code\])(.*)\[\/\1$/\n\n    \2\n\n/p' file | sed -n l