web-dev-qa-db-ja.com

linux-すべての二重改行をスペースに置き換えます

Sed、awk、grep、tr、または必要なものを使用して、テキストファイル内の2つの改行のみを置き換えることは可能ですか?

this

is

data
this

is

more

data

私がする必要があるのは、すべての二重改行(\ n\n、空白はありません)をスペースに置き換えることですが、すべてのデータポイントが独自の行にあるように、すべて単一の改行を保持します。

this is data
this is more data

これは可能ですか?

4
nermolov

試してみてください

    sed ':a;N;$!ba;s/\n\n/ /g'  filename

これにより、最初にファイル全体が読み取られ、次に2つの改行(およびそれらのみ!)がスペースに置き換えられます。ほとんどのGNU/Linuxユーティリティは一度に1行ずつ入力を処理するため、このトリック(ファイル全体を読み取る)が必要です。これにより、間違った結果が得られます。

8
MariusMatutiae

ちょうど別の変種:awkバージョン

awk 'BEGIN{RS="\n\n" ; ORS=" ";}{ print }' 
4
Hastur

@MariusMatutiaeの回答に追加:ファイルが大きすぎてメモリに読み取れない場合は、従来の方法を使用できますが、はるかに低速です。

EMPTY=0
BUFFER=""
while read L; do
  if test -z "$L"; then
    EMPTY=$(($EMPTY+1))
    BUFFER="$BUFFER\n"
  else
    if test $EMPTY -lt 2; then
      echo -en "$BUFFER"
    else
      echo " "
    fi
    echo "$L"
    BUFFER=""
    EMPTY=0
  fi
done < filename
echo -ne "$BUFFER"
2
Eugen Rieck