Как найти недопустимые символы? [Закрыто]

Вы МОЖЕТЕ сделать это с помощью одного экземпляра sed ; нет необходимости в трубах. Поскольку sed выполняет только один проход через документ, и поскольку часть файла, необходимая в качестве начала вывода, находится в конце файла, он потребует хранить весь файл в памяти внутри sed (в области удержания) - поэтому он может плохо масштабироваться. Но он дает точный ответ на вопрос:

:getpara
   ${
      s/$/\
/
      G
      s/\n\n$//
      q
   }
   N
   /\n$/!bgetpara
G
h
$!d
s/\n\n$//
q

Если нет завершающей новой строки, это все равно работает нормально. Если есть одна завершающая новая строка, она подавляется в выводе (то есть в выводе не будет ведущей новой строки). Если есть (например) 5 завершающих символов новой строки на входе, на выходе будет 4 ведущих символа новой строки.

Пробелы между абзацами сохранены.

Пробелы в пустой строке НЕ обрабатываются как разрыв абзаца, но это особенность, а не ошибка. :)

Вы также можете сделать это как гораздо менее читаемый однострочный:

sed ':k;${;s/\(\(\n\).*\)$/\1\2/;G;s/\n\n$//;q;};N;/\n$/!bk;G;h;$!d;s/\n\n$//;q' inputfile

Хотя это работает только с GNU sed . (Обратите внимание на сложное использование обратных ссылок для выполнения s / $ / \ n / . Без этого он не был бы буквальным однострочным, поскольку он содержал бы обратную косую черту-новую строку.)

{{ 1}}
-1
11.05.2018, 12:57
0 ответов

Теги

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