2

我刚刚学会了如何在 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

4 回答 4

1

要可靠地做到这一点,您需要一个降价解析器。(我相信基于 awk 的解决方案也会在代码块的行尾插入空格,这是您不希望的。)使用 pandoc 1.11.1 或更高版本,您可以这样做:

pandoc -fmarkdown_strict+hard_line_breaks -t markdown_strict

请注意,如果您打算使用 pandoc 作为降价处理器,您可以简单地将文件保持原样,并使用其中一个markdown+hard_line_breaksmarkdown_strict+hard_line_breaks作为您的输入格式。

于 2013-09-02T14:42:25.203 回答
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

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

于 2013-09-02T12:20:03.913 回答
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 = " ".

于 2013-09-02T12:36:01.800 回答
0

这可能对您有用(GNU sed):

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

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

于 2013-09-02T16:20:55.593 回答