複数の段落を解くための簡単なフィルタ

複数の段落を解くための簡単なフィルタ

80文字で圧縮されたMarkdownファイルがたくさんあります。これをコピーしてテキスト領域()に貼り付けたいのですが、xclip -sel clipboard < file正常にラップするようにしたいと思います。段落のない単純tr "\n" " " < file | xclip -sel clipboardですが、すべてのテキストを連続する段落に置き換えるには、手動でコピー編集が必要です。

すべての\ nを削除するために標準の* NIXツール(GNUバージョンが良い)を使用する短いフィルタはありますか?とは別に二つが並んでいるとき?可能であれば、私は覚えて再入力することができます。 30文字未満で文書はありません。sed何か措置を取らなければならないような感じがします。

ベストアンサー1

あなたが使用できるperl

たとえば、次のようなハードパックのサンプル入力ファイルを使用します。

$ cat input.txt
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor
incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis
nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat.

Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu
fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in
culpa qui officia deserunt mollit anim id est laborum.
$ perl -0777 -p -e 's/(?<!\n)\n/ /g' input.txt 
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. 
Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

または各段落の間に空白行が必要な場合:

$ perl -0777 -p -e 's/(?<!\n)\n/ /g; s/\n/\n\n/g' input.txt 
Lorem ipsum dolor sit amet, consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. 

Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum.

注:入力が1つ以上の空行で終わらない限り、出力の最後の行には改行文字はありません。必要に応じて; END {print "\n"}スクリプトの最後に追加してください。これにより、出力が改行文字で終わります。

この-0777オプションは、Perlに、入力ファイルを一度「フルルック音」にして1つの長い文字列として処理するように指示します。

上記の1行のコードバージョンはすべて、「幅なしネガティブナビゲーションアサーション」 - というPerl正規表現機能を使用します(?<!pattern)。詳細については、man perlre「Lookaround Assertions」を参照して検索してください。つまり、(?<!\n)\n改行文字と一致します。〜しない限りその前の文字は別の改行文字であり、実際に前の文字を一致させたりキャプチャせずにこれを行います(これが「幅のないアサーション」が意味するものです)。

否定的な事後アサーションを使用しないと、同様のことをしたいと思う誘惑を受ける可能性がありますs/[^\n]\n/ /g。しかし、これは最終的にすべての改行の前にあるすべての文字を削除します...これが正規表現の幅がゼロの部分が重要な理由です。これは、このようなことが起こらないようにする。 。もう1つの選択肢は、このようなものを使用してs/([^\n])\n/\1 /g改行の前の文字をキャプチャし、それを置き換えに使用することです。たとえば、GNU sedを使用します。sed -E -z 's/([^\n])\n/\1 /g' input.txtしかし、私の考えでは、前の文字を一致させて削除するよりもまったく一致しない方が良いです。もう一度入れてください。

他のいくつかの正規表現エンジンもナビゲーションアサーションをサポートしていますが、これは非標準であるため、サポートは保証されません。

おすすめ記事