Относительно этого дубликата: есть аналогичные вопросы, такие как https://unix.stackexchange.com/questions/76061/can-sed-remove-double-newline-characters или https://stackoverflow.com/questions/27510462/how-can-i-remove-double-line-breaks-with-sed - в популярном первом, хотя исходный вопрос, вероятно, такой же, как мой, его принятый и наиболее обсуждаемый вопрос удаляет все пустые строки, а не только когда Есть 2 или более вместе ", как заданный вопрос. Некоторые комментарии жалуются на то, что этот ответ, а другие ведут себя таким образом, но никаких ответов не дано, чтобы оставить одну пустую строку. Некоторые другие ответы превращают дублирующиеся пустые строки в одну пустую строку (сжимая), а не удаляя их полностью.


Я ищу способ написания сценариев для удаления спина к спине пустых строк, но оставить там пустые строки.

Я ищу, чтобы автоматически очистить файлы .srt (субтитры). Формат требует, чтобы новые строки были между разделами субтитров (что отображать в определенный промежуток времени.) Обычно, если нужно отобразить 2 строки одновременно, у автора субтитров просто есть 2 строки. Есть еще один стиль, который используют некоторые авторы для размещения 2 пустых строк между отображаемыми строками. На моем устройстве это приводит к отображению только первой строки и, по-видимому, к отображению второй строки вне телевизора.

Итак, я хотел бы изменить это:

1
00:00:01,800 --> 00:00:03,802
    First line is here


    Second line is here

2
...

В это:

1
00:00:01,800 --> 00:00:03,802
    First line is here
    Second line is here

2
...

Не то чтобы это, вероятно, нужно обрабатывать по-другому, но формат файла требует, чтобы в нижней части файла была пустая строка, которую нужно оставить там.

Я хочу, чтобы это сработало, возможно, сначала удаляя конечные пробелы, а затем удаляя только все пустые строки, которые касаются другой пустой строки. Я не хочу, чтобы он был привязан к остальному формату .srt , например, к количеству строк между пронумерованными разделами. (Я думал, что все пустые строки могут быть удалены, и новые строки могут быть добавлены обратно в строки, содержащие только числовые символы, но я надеюсь сохранить его более общим, игнорируя фактический формат .srt .)

Кроме того, если по какой-то причине .srt содержит более 2 строк текста, я бы хотел, чтобы он оставался таким.

Так что, возможно, что-то вроде:

cat some.srt | sed 's/[ \t]*$//' | SOMETHING_ELSE

Я бы предпочел решение bash , sed или awk а не perl . Если я правильно понимаю, я думаю, что awk будет проще реализовать, нежели sed , поскольку он многострочный.

1 ответ1

0

Если остальные смежные строки в ваших файлах уникальны, и вы хотите удалить только соседние пустые строки, вы можете просто использовать uniq:

uniq - сообщает или пропускает повторяющиеся строки

Фильтруйте соседние совпадающие строки из INPUT (или стандартного ввода), записывая в OUTPUT (или стандартный вывод).

Без опций совпадающие строки объединяются с первым вхождением.

Выполнение файла примера через него возвращает:

$ uniq testfile
1
00:00:01,800 --> 00:00:03,802
    First line is here

    Second line is here

2
...

PS. ваш пример не делает то, что субъект запрашивает, он удаляет все пустые строки между первым и вторым - он не оставляет ни одной пустой строки.

Интересно, что использование uniq -u (выводить только уникальные строки) в файле примера дает результаты в выводе примера (удаляет две пустые строки, не оставляя ни одной между первым и вторым):

$ uniq -u testfile
1
00:00:01,800 --> 00:00:03,802
    First line is here
    Second line is here

2
...

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