単一の改行文字のみを置き換えるより良い方法が必要ですか?

単一の改行文字のみを置き換えるより良い方法が必要ですか?

私は通常LaTeXでコンパイルしたり、別の形式で書いたり、改行文字は無視されるので、文ごとに1行を書くのに慣れています。私は新しい段落の始まりを示すために空行を使用します。

これでこのスタイルで書かれたファイルがあり、それをプレーンテキストで送信したいと思います。すべての単一の改行を削除し、二重の改行はそのままにしたいと思います。これが私がしたことです:

sed 's/^$/NEWLINE/' file.txt | awk '{printf "%s ",$0}' | sed 's/NEWLINE/\n\n/g' > linebreakfile.txt

これは空の行をファイルにないと確信しているいくつかのテキストに置き換えます。NEWLINE次に、すべての改行を削除しawk(一部のWebサイトでこのトリックを見つけました)、NEWLINEsを必要な2つの改行に置き換えます。

これは非常に簡単なことをするのに長い時間がかかるようです。より簡単な方法がありますか?そして、複数の空白(何らかの理由で時々現れることもあります)を1つの空白に置き換える方法もあれば良いようです。

私はemacsを使用しているので、emacs関連のトリックがあれば良いと思いますが、純粋なバージョンsedまたは純粋なawkバージョンを好みます。

答え1

次のようにawkを使用できます。

$ awk ' /^$/ { print; } /./ { printf("%s ", $0); } ' test

または最後に追加の改行文字が必要な場合:

$ awk ' /^$/ { print; } /./ { printf("%s ", $0); } END { print ""; } ' test

または改行文字で段落を区切る場合:

$ awk ' /^$/ { print "\n"; } /./ { printf("%s ", $0); } END { print ""; } ' test

これらの awk コマンドは、モードで保護された操作を利用します。

/regex/

または

END

次の操作は、パターンが現在の行と一致する場合にのみ実行されます。

そして、これらの文字は、行の始まり、終わり、およびすべての文字が一致する正規表現^$.で特別な意味を持ちます。^$.

答え2

awkまたはPerlを使用してください。短絡モード空白行でセクションを区切って、ファイルセクションをセクションごとに処理します。

awk -vRS= '
  NR!=1 {print ""}      # print blank line before every record but the first
  {                     # do this for every record (i.e. paragraph):
    gsub(" *\n *"," "); # replace newlines by spaces, compressing spaces
    sub(" *$","");      # remove spaces at the end of the paragraph
    print
  }
'
perl -000 -pe '             # for every paragraph:
  print "\n" unless $.==1;  # print a blank line, except before the first paragraph
  s/ *\n *(?!$)/ /g;        # replace newlines by spaces, compressing spaces, but not at the end of the paragraph
  s/ *\n+\z/\n/             # normalize the last line end of the paragraph
'

もちろん、これは(La)TeXを解析しないので、コメント、逐語的環境、その他の特殊な構文に大きな混乱をもたらすでしょう。あなたは知りたいかもしれませんディテックスまたは他の(La)TeXをテキストに変換するコンバータ。

答え3

(以前の質問を元に戻す)

これはまさに何であり、fmt段落par形式の再指定のためのようです。あなたと同じように(そして多くのプログラムのように)段落境界を1つ以上の空行として定義します。次のいずれかでテキストをパイピングしてみてください。

fmtGNU Coreutilsの標準的なUnixユーティリティです。

parfmtAdam M. Costelloによって書かれた大幅に改良されたバージョンで、次の場所にあります。http://www.nicemice.net/par/(また、Debianを含むいくつかのディストリビューション用にパッケージ化されていますが、今は新しいpkg管理者がいますが、私は1996年1月にDebian用にパッケージ化しました。)

答え4

私が正しく理解した場合、空の行は2つの連続改行を意味します\n\n

その場合、考えられる解決策の1つは、個々に発生する改行文字をすべて削除することです。

Perlでは、予測アサーションはこれを行う1つの方法です。

$ perl -0777 -i -pe 's/\n(?=[^\n])//g' test
  • この-0777フラグはファイル全体を単一の文字列に効果的にマージします。
  • -pPerlに処理中の文字列をデフォルトで印刷するように指示します。
  • -i内部編集の指定
  • グローバルマッチングは、すべての単一改行項目が処理されることを保証します。

関連情報