我正在尝试使用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$
$
$
但这并不像预期的那样有效。任何建议为什么,如何解决这个问题?
谢谢
答案 0 :(得分:2)
sed '/\[code\].*\[\/code\]/ {
s#\[code]#& #g
s#\[/*code\]#\
\
#g
}' sed.txt
替换顺序很重要,并且在您的两个样本之间发生了变化
我也改变了一点行为,在这个文本示例中不需要-n
和p
(但可能来自最大的结构)
(测试我的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个空格,因此缩进将添加到不在文本前面的第一个换行符的前面。