Удалить пустую строку, если есть только одна между двумя строками, если есть два пустых строки, удаляют только один

Да, это возможно несколькими способами, но вам понадобится сервер X Window для Windows. Некоторые варианты сервера X Windows: XManager, XMing и MobaXterm.Если у вас есть X-сервер, работающий в Windows, вы можете использовать PuTTY для подключения к вашему хосту после того, как вы установили параметры конфигурации:

Connection/SSH/X11
  Enable X11 forwarding
  X display location: localhost:10.0

Где 10.0 зависит от того, что слушает сервер X Window.

Когда вы настроили сервер X Window и PuTTY и вошли в систему на своем хосте, вы можете проверить переменную DISPLAY , если установлен DISPLAY :

$ echo $DISPLAY
localhost:10.0

Затем попробуйте что-нибудь вроде xclock , чтобы проверить, работает ли пересылка X11:

# xclock &

Другой способ использовать X11, помимо ssh , - это установить переменную DISPLAY вручную, чтобы она указывала на IP-адрес, например :

# export DISPLAY=192.168.0.1:0

И посмотрите, работает ли это:

# xclock &

Таким образом X-приложения (перенаправляются) для вывода на удаленный сервер X Window.

Примечание : помните, что протокол X11 не предназначен для работы с медленными сетевыми (WAN) соединениями. Приложение X может быть ужасно медленным при использовании через медленное соединение. Рассмотрите возможность использования переключателя -C (сжатие) с ssh , чтобы использовать сжатие в сеансе ssh , чтобы немного ускорить его.

1
05.01.2019, 09:29
5 ответов

Если файл достаточно мал и не помещается в памяти, вы можете удалить файл с помощью perlи удалить все символы новой строки, которые идут после символа пробела, отличного от -, и еще одной новой строки:

$ perl -0pe 's/(\S\n)\n/$1/g' file 
this    is    testing  1
this    is    testing   2

this    is      testing 4
1
27.01.2020, 23:18

С помощью Awk вы можете установить разделитель записей на двойную -новую строку, а затем печатать каждую запись с разделителем выходных записей с одинарной новой строкой по умолчанию.

С POSIX Awk это приведет к появлению дополнительной новой строки после последней записи -если у вас есть GNU Awk(gawk)вы можете предотвратить это, установив пустой разделитель выходных записей, если фактический разделитель входных записей пуст:

$ gawk -vRS='\n\n' 'RT=="" {ORS=""} 1' file.txt
this    is    testing  1
this    is    testing   2

this    is      testing 4
0
27.01.2020, 23:18
awk 'BEGIN {prev_empty = "TRUE"}; {if (/^$/) {if (prev_empty) {print}; prev_empty = "TRUE"} else {prev_empty = ""; print}}' file.txt

Пояснение

  • BEGIN {prev_empty = "TRUE"}:начните с инициализации переменной prev_emptyзначением TRUE.
  • if (/^$/):проверить, пуста ли строка (т.е. соответствует регулярному выражению/^$/).
  • Если да, то{if (prev_empty == "TRUE") {print}; prev_empty = "TRUE"}:если предыдущая строка была пустой, то вывести ее, иначе не печатать (т.е. удалить ее ). Затем установите переменную prev_emptyв TRUE.
  • Если текущая строка не пуста,{prev_empty = ""; print}:установите для переменной prev_emptyзначение null и напечатайте строку.

Логика такова, что почти во всех ситуациях выводить текущую строку. Однако не печатает текущую строку, если текущая строка пуста (соответствует /^$/), а предыдущая строка не была -пустой (, т.е.prev_empty = "").

0
27.01.2020, 23:18
$ awk '{ print; if (length) getline }' file
this    is    testing  1
this    is    testing   2

this    is      testing 4

Это печатает результат и читает за пустой строкой после него, если результат имел какое-либо содержимое. Для пустых результатов никакая дополнительная строка не пропускается.

Это приведет к печати нескольких последовательных пустых строк, только если имеется несколько последовательных пустых результатов. Вывод будет иметь ровно одну строку на результат (пустой или нет):

$ cat file
this    is    testing  1

this    is    testing   2



this    is      testing 5

$ awk '{ print; if (length) getline }' file
this    is    testing  1
this    is    testing   2


this    is      testing 5
1
27.01.2020, 23:18

Это удалит новую строку, только если после некоторого символа (только первая новая строка после строки с текстом):

 sed -n '$!N;s/\(.\)\n/\1/;P;D' file
2
27.01.2020, 23:18

Теги

Похожие вопросы