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


4

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

this

is

data
this

is

more

data

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

this is data
this is more data

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

Ответы:


7

Пытаться

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

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


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

4

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

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

Замечания: 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"
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.