0

過去に何度も、段落を保存する必要があることを除いて、空白のすべての実行が単一のスペースに「折りたたまれる」ようにテキストのブロックをフォーマットする問題について疑問に思いました-つまり、空白行のすべての実行がに折りたたまれます単一の空白行ですが、スペースだけに折りたたまれていません。

空白行はもちろん、空白以外の文字が介在しない 2 つの行末文字 (通常はキャリッジ リターンまたはラインフィード、またはその両方) です。(スペースやタブなど、他の空白がある場合もあります)。

これは確かにかなり一般的な問題であり、解決するのは難しくありませんが、エレガンスに欠けていたり、抜け穴が開いたままになっている私のソリューションには常に不満があります。確かに、これを行うためのエレガントな表現方法があります。

少なくとも Perl、Vim、および JavaScript で実行したかったので、これをすべての正規表現フレーバーに対してオープンのままにします。これがnode.jsでそれを行うための私の最近の怠惰な試みです。抜け穴は明らかに魔法の言葉です。これはおそらく、私が使用した不十分なソリューションのかなり典型的なものです::

text = text.replace(/\r?\n(?:\s*\r?\n)+/g, '_SomeMagicWord_');
text = text.replace(/\s\s+/gm, ' ');
text = text.replace(/_SomeMagicWord_/g, '\r\n\r\n');

私の説明が明確でない場合は、次から変換する必要があります。

フー バー
バズ フレッド バーニー ウィルマ


ワン ツー スリー

これに:

フー バー バズ フレッド バーニー ウィルマ

ワン ツー スリー

(行末の末尾の空白にも注意してください!)

4

2 に答える 2

1

sed:

sed -n 'H;$g;$s/[^\n]\n[^\n]/ /g;$s/\n\n\n*/\n\n/g;$s/  */ /g;$s/^\n//;$p' FILENAME

Perl:

perl -ne '$a.=$_;END{$_=$a;s/  */ /g;s/[^\n]\n[^\n]/ /g;s/\n\n\n*/\n\n/g;print}' FILENAME
于 2013-02-08T12:43:39.010 に答える