用sed缩进行范围?

时间:2015-02-13 11:52:07

标签: regex linux sed

我正在尝试使用phpBB将旧时尚MARKDOWN代码块转换为sed

请考虑以下数据样本:

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$
$
$

但这并不像预期的那样有效。任何建议为什么,如何解决这个问题?

谢谢

2 个答案:

答案 0 :(得分:2)

sed '/\[code\].*\[\/code\]/ {
   s#\[code]#&    #g
   s#\[/*code\]#\
\
#g
   }' sed.txt

替换顺序很重要,并且在您的两个样本之间发生了变化

我也改变了一点行为,在这个文本示例中不需要-np(但可能来自最大的结构) (测试我的aix so posix版本)

答案 1 :(得分:0)

这可能适合你(GNU sed):

sed -nr 's/^\[(code\])(.*)\[\/\1$/\n\n    \2\n\n/p' file | sed -n l

N.B。在您的脚本中,您在模式空间的开头添加2个换行符,然后再添加4个空格,因此缩进将添加到不在文本前面的第一个换行符的前面。