linux - заменить все двойные символы новой строки пробелом

4

Можно ли заменить только двойные символы новой строки в текстовом файле, используя sed, awk, grep, tr или что-то еще?

this

is

data
this

is

more

data

Что мне нужно сделать, это заменить все двойные символы новой строки (\ n \ n, пробелов нет) пробелом, но сохранить все одинарные символы новой строки, чтобы все мои точки данных находились на отдельной строке.

this is data
this is more data

Это возможно?

nermolov
источник

Ответы:

7

Пытаться

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

Сначала будет прочитан весь файл, а затем заменены двойные символы новой строки (и только те!) Пробелом. Этот трюк (чтение всего файла) необходим, потому что большинство утилит GNU / Linux обрабатывают ввод по одной строке за раз, что даст неверный результат.

MariusMatutiae
источник
Эта команда не работает для меня. sed ':a;N;$!ba;s/\n\n/ /g' file1.txt > file2.txt в результате оба файла имеют одинаковый хэш MD5.
Aaron Franke
4

Просто другой вариант: awk версия

awk 'BEGIN{RS="\n\n" ; ORS=" ";}{ print }' 
Hastur
источник
Замечания: RS является разделителем записей intput, по умолчанию это перевод строки. ORS является разделителем выходной записи, по умолчанию символ новой строки. По-прежнему man awk чтобы получить больше информации.
Hastur
1

Добавление к ответу @ 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"
Eugen Rieck
источник