4

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

this

is

data
this

is

more

data

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

this is data
this is more data

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

3 ответа3

7

Пытаться

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

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

4

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

awk 'BEGIN{RS="\n\n" ; ORS=" ";}{ print }' 
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"

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .