Соедините несколько строк с помощью начального и конечного шаблона

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

Щелкните правой кнопкой мыши панель и выберите «Добавить апплеты на панель». Нажмите «Загрузить» в верхней части окна апплета, и вы сможете загрузить Icing Task Manager. После завершения загрузки вам нужно будет добавить его на свою панель через вкладку «Управление». Выберите его из списка и нажмите кнопку «+» внизу. Выберите апплет «Список окон» и нажмите «-». При желании, «Панели запуска» могут быть удалены таким же образом.

Этот апплет имеет множество параметров настройки на ваш вкус.

7
07.06.2021, 04:52
6 ответов

На основе Sed One -Объяснения вкладышей, часть I :Интервал между файлами, нумерация, преобразование текста и замена , 39. Добавлять строку к следующей, если она заканчивается символом обратная косая черта "\" , но с заменой обратной косой черты на запятую и расширением замены, включающим следующие пробелы:

$ sed -e :a -e '/,$/N; s/,\n[[:blank:]]*/,/; ta' file
method AAA one (1,111):
   some_text_1
method BBB two (2,222):
   tuesday
method CCC three (3,333):
   sunny_day
method DDD four (4,444_a,444_b):
   last_week
9
28.07.2021, 11:26

Мы устанавливаем петлю do-whileс несколькими условиями прорыва, как показано.

    В строке
  • нет строки метода, прорыв.
  • линия полностью сформирована, имеет метод, а также ):в ней прорыв
  • последняя строка, выйти
  • для каждой второй строки соедините ее с помощью next и удалите соединяющие пробелы (s ).
sed -e '
  :loop
    /method/!b
    /method.*):/b
    $q
    N;s/\n\s*//
  b loop
' file.txt

Выход:

method AAA one (1,111):
   some_text_1
method BBB two (2,222):
   tuesday
method CCC three (3,333):
   sunny_day
method DDD four (4,444_a,444_b):
   last_week
2
28.07.2021, 11:26

Сawk:

awk 'f{sub(/^[[:space:]]+/, "")} {f=/,$/; ORS = f ? "" : RS} 1'

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


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

perl -0777 -pe 's/,\n\s*/,/g'

Приведенные выше решения не сработают, если у вас есть строки, оканчивающиеся на ,, которые не являются частью функции method. В таких случаях, предполагая, что для части methodбудет только одна пара символов (), вы можете использовать:

perl -0777 -pe 's/method[^(]+\([^)]+\)/$&=~s|\n\s*||gr/ge'

Здесь method[^(]+\([^)]+\)будет соответствовать от methodдо первых (и )символов. Раздел замены содержит другой код Perl, который будет воздействовать на совпадающую часть, чтобы удалить новые строки, за которыми следуют необязательные символы пробела.

3
28.07.2021, 11:26

Другой sed'er (POSIX):

sed ':a;/^method/!b;/[^:]$/N;s/[[:space:]]*\n[[:space:]]*/ /g;ta'
  • Этикетка DEF:a
  • Пространство шаблона IF не начинается с method
    • ТОГДА перейти к концу наb
  • ELSE, если не заканчивается на :
    • ТОГДА добавьте следующую строку, используя N.
  • ЗАМЕНИТЬspaces*+ \n+spaces*на ' '
    • ЕСЛИ произошла замена,вернуться к:a
  • КОНЕЦ печати

Должен обрабатывать такие случаи, как:

method XXX foo (8,
    888):
   bar,
   baz

method
HHH
bar
(
aa,
bb):
    lor

Добавляет дополнительные пробелы вокруг параметров.

2
28.07.2021, 11:26

Использованиеgawk:

awk 'function del_space(){gsub(/^\s+/,""); };
/,$/ {if (NR==l) del_space(); a=a $0; l=NR+1; next}
NR==l{del_space(); $0=a $0; a=""}1' file

Пока в конце строки находится запятая, переменная aсохраняет текущую входную запись ($0), за которой следует пробел, а затем предыдущая запись. nextпредотвращает дальнейшие действия с этой записью, т. е. не будет печати, если в конце команды используется идиома awk's 1для печати.

В следующей записи после сопоставления шаблона $0=a $0;a="";устанавливает текущую входную запись($0)на a, за которой следует старая $0и переменная aна ""соответственно.

Функция del_space()заменяет пробел с начала следующей записи после того, как ,находится в конце записи.

Если вы хотите поставить пробел после запятой, то это следует изменить на это:

awk 'function del_space(){gsub(/^\s+/,""); };
/,$/ {if (NR==l) del_space(); a=a $0; l=NR+1; next}
NR==l{del_space(); $0=a FS $0; a=""}1' file
3
28.07.2021, 11:26

Другой Posix sedспособ:

sed '
  /,$/bl
  be
  :l
    N
    s/\n *//g
    /):$/!bl
  :e
' data
  • При нахождении строки, заканчивающейся запятой, переход к метке l:/,$/bl

    • В противном случае перейдите кe(Пустая этикетка, здесь только для печати):be
  • метка lэмулирует цикл следующим образом:

    • Получить следующую строку:N

    • Замените новую строку и начальные пробелы на эту:s/\n *//g

    • Если текущие строки НЕТ заканчиваются на ):, то повторите цикл и снова возьмите другую строку (и повторите все):/):$/!bl

    • В противном случае введите метку eи напечатайте строку.

0
28.07.2021, 11:26

Теги

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