Как я могу удалить весь текст между вложенными фигурными скобками в файле многострочного текста?

Шрифты хранятся в некоторых различных, известных каталогах как ~/.fonts и /usr/share/fonts, обычно. Любой допустимый файл шрифтов, который Вы подвергаете одному из этих каталогов, разоблачит в выборе Ваших приложений вид шрифта диалоговых окон. Приложение менеджера по шрифту может возможно сохранить файлы шрифтов в каталоге, это известно ему, но не разыскивается шрифты в масштабе всей системы, затем создайте символьные ссылки от этих каталогов шрифта до фактических файлов шрифтов. При включении шрифта он может создать символьную ссылку и удалить его, когда Вы отключаете. Таким образом это не должно удалять файлы шрифтов из Вашей файловой системы и требовать, чтобы Вы переустановили каждый раз, когда Вы хотите их снова.

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

У меня нет четкого представления о том, почему Ваши шрифты повреждаются, хотя, но у меня могут быть предположения: ошибка Вас, ошибки в программе и/или многих других возможных фактах. Но я предложил бы руководящие шрифты вручную. Вещь, которую необходимо сделать, к перемещению/символьной ссылке их к ~/.fonts каталог, чтобы сделать их доступными, и отодвинуть их от этого каталога для создания их недоступными. Можно поместить их в своего рода каталог моих-шрифтов, который Вы выбираете (т.е. Я вставил мой ~/Dropbox/my/typeface/), и символьная ссылка на них изнутри ~/.fonts когда Вы хотите включить, и все еще использовать те приложения для простого просмотра тех шрифтов.

9
13.04.2017, 15:36
2 ответа
$ sed ':again;$!N;$!b again; :b; s/{[^{}]*}//g; t b' file3
This is 
that wants
 anyway.

Объяснение:

  • : снова; $! N; $! B опять

    Это читает во всем файле.

    : опять - это метка. N Читает в следующей строке и $! N Читает в следующей строке при условии, что мы еще не на последней строке. $! B Опять же Ветви обратно в снова метку в условиях, что это не последняя строка.

  • : B

    Это определяет метку B .

  • S / {[^ {}] *} // G

    Это удаляет текст в брекетах, если текст не содержит внутренних скобок.

  • T B

    Если вышеупомянутая команда замены привела к изменению, прыгайте назад к метке B . Таким образом, команда замены повторяется до тех пор, пока все скобки не будут удалены.

13
27.01.2020, 20:05

Перл-подход:

$ perl -F"" -a00ne 'for (@F){$i++ if /{/; $i||print; $i-- if /}/}' file
This is 
that wants
 anyway

Объяснение

  • -a : включает автоматическое разбиение на разделитель файлов, заданный -F в массив @F.
  • -F"" : устанавливает разделитель полей ввода пустым, в результате чего каждый элемент @F будет одним из входных символов.
  • -00 : включает "абзацный режим", где "строка" определяется как два последовательных символа новой строки. Это означает, что весь файл в данном случае будет рассматриваться как одна строка. Если в вашем файле может быть много параграфов, а скобки могут охватывать несколько параграфов, используйте -0777 вместо этого.
  • -ne : прочитайте входной файл и применяйте к каждой строке скрипт, заданный -e.

Сам скрипт на самом деле довольно прост. Счетчик инкрементируется на единицу каждый раз при просмотре { и декрементируется на единицу для каждой }. Это означает, что когда счетчик равен 0, мы не заключены в скобки и должны вывести:

  • for (@F){} : сделайте это для каждого элемента @F, каждого символа в строке.
  • $i++ if /{/; : увеличивать $i на единицу, если этот символ является {
  • $i||print; : печатать, если не установлен $i (0 засчитывается как неустановленный).
  • $i- если /}/ : декремент $i на один, если этот символ является }
3
27.01.2020, 20:05

Теги

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