Как я могу сделать Sed Edit Stream во второй раз, не отправляя его в себя? - PullRequest
0 голосов
/ 09 июля 2019

У меня есть скрипт bash, который должен постоянно редактировать команду монитора, поэтому я могу использовать только один канал, иначе вывод не будет сгенерирован.Я хочу, чтобы sed редактировал уже отредактированный поток, но делаю это внутри одного скрипта

, эта команда генерирует кучу информации о выводе wm

bspc subscribe report

:

WMeDP-1:oI:OII:oIII:fIV:fV:fVI:fVII:oVIII:oIX:oX:LT:TT:G
WMeDP-1:oI:oII:oIII:fIV:FV:fVI:fVII:oVIII:oIX:oX:LT
WMeDP-1:oI:oII:oIII:fIV:fV:FVI:fVII:oVIII:oIX:oX:LT
WMeDP-1:oI:oII:oIII:fIV:fV:fVI:FVII:oVIII:oIX:oX:LT

это

bspc subscribe report | sed 's|:|\n|g' 

отлично работает

вывод:

WMeDP-1
oI
OII
oIII
fIV
fV
fVI
fVII
oVIII
oIX
oX
LT
TT
G
...

но тогда мне нужно проанализировать каждую строку вновь сгенерированного потока, но конвейер как этот не вариант

bspc subscribe report | sed 's|:|\n|g' | sed '|^O| {...} ...'

Я пытался сделать несколько выражений

sed -e 'something' -e 'something'

Я пытался использовать y вместо s

Я пытался обменяться пробелами и пробелами, ноничего не помогло

Я новичок в sed, так что я уверен, что что-то пропустил, помогите

Ответы [ 2 ]

0 голосов
/ 09 июля 2019

Когда вы вводите новые строки путем подстановки, пространство шаблона будет содержать многострочное выражение (поэтому O в начале строки не обязательно будет соответствовать регулярному выражению ^O).В этом случае тривиальным решением является переключение порядка команд в сценарии.

sed -e 's/\(^\|:\)O/{ ... stuff ... }' -e 'y/:/\n/'

Без дополнительной информации о том, что в ... stuff ... невозможно более подробно указать, будет ли это работать для вас,Возможно, для вашего ... stuff ... потребуется дополнительный рефакторинг;или, возможно, самое простое решение - запустить sed дважды.В некоторых версиях sed есть опция -u или --unbuffered, которая может помочь решить проблему запуска нескольких сценариев в интерактивном конвейере.

Возможно, сценарий sed может быть реорганизован для зацикливания каждого поляпосле замены;но опять же, без более подробных требований, это обязательно довольно расплывчато.Посмотрите на записи : и b в руководстве sed.

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

0 голосов
/ 09 июля 2019

Вы можете указать несколько выражений для одной команды sed, разделив их точкой с запятой (;)

Пример, который вы предоставили, будет выглядеть следующим образом:

bspc subscribe report | sed 's|:|\n|g;|^O| {...} ...'

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

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