将传统换行符转换为Markdown双空格换行符

时间:2013-09-02 12:12:10

标签: macos unix sed awk markdown

我刚学会了如何在Markdown中进行实际换行,在行尾有两个空格。我有很多文件要转换成这种做法,因为习惯它会让我的生活变得更容易使用像Pandoc这样的Markdown工具。

这些文件目前如下所示:

Roses are red
Violets are blue

Bananas are yellow

Oranges are orange

我想用多行换算段落,以便结果如下:

Roses are red<space><space>
Violets are blue

Bananas are yellow

Oranges are orange

可悲的是,我的linux fu无法完成任务。我有\n行尾。这是我如何开始它:

for i in \*; do sed -e 's/\n/  /g' "$i"; done

我完全不知道如何区分换行符后跟不应修改的空行(第2行),换行符后跟文本应该由sed(第1行)修改。此外,应忽略空行(第3行)。有人可以帮助我吗?

4 个答案:

答案 0 :(得分:1)

为了可靠地执行此操作,您需要一个markdown解析器。 (我相信基于awk的解决方案也会在代码块的行尾插入空格,这是你不想要的。)使用pandoc 1.11.1或更高版本,你可以这样做:

pandoc -fmarkdown_strict+hard_line_breaks -t markdown_strict

请注意,如果您计划将pandoc用作降价处理器,则只需将文件保留原样,并使用markdown+hard_line_breaksmarkdown_strict+hard_line_breaks作为输入格式。

答案 1 :(得分:0)

更改空行

你是说这个意思吗?我使用xx来更容易在输出中看到:

kent$  awk '{$0=$0"xx"}7' f
Roses are redxx
Violets are bluexx
xx
Bananas are yellowxx
xx
Oranges are orangexx

因此,每个“新行”将替换为two 'x' with newline。如果这是你想要的,你可以这样做:

awk '{$0=$0"  "}7' file

而不更改空行

如果你想忽略空行(对于空行不做任何替换): 看看这个:

kent$  awk '$0{$0=$0"xx"}7' f
Roses are redxx
Violets are bluexx

Bananas are yellowxx

Oranges are orangexx

所以你看到double x上面的空行没有显示。你可以使用命令:

awk '$0{$0=$0"  "}7' file

修改

kent$  awk 'NR==1{p=$0;next}{p=p&&$0?p"xx":p; print p;p=$0}END{print $0}' f
Roses are redxx
Violets are blue

Bananas are yellow

Oranges are orange

检查上面的一行,所有空行和前一行空行都被忽略。该文件的最后一行也被忽略。

答案 2 :(得分:0)

$ awk '
{
    if (NF) {
        head = tail
        tail = "<space><space>"
    }
    else {
        head = ""
        tail = ""
    }
    printf "%s%s%s", head, (NR>1?ORS:""), $0
}
END { print "" }
' file
Roses are red<space><space>
Violets are blue

Bananas are yellow

Oranges are orange

只需将tail = "<space><space>"更改为tail = " "

答案 3 :(得分:0)

这可能适合你(GNU sed):

 sed '$!N;/^\s*\n\|\n\s*$/!s/\n/<space><space>&/;P;D file

这样可以在模式空间中保留2行。如果第一行或第二行是空的,即段落的开头或结尾,则打印出第一行不变。但是如果它们不是,那么它会在换行符前面加上所需的字符串。