Eu tenho entrada assim, preciso mover a linha após *_job para o final da linha *_job, se for job_type e imprimir o arquivo inteiro. SE a próxima linha não for job_type apenas imprima-os.
eu consigo imprimir apenas a linha com *_job pelo SED, mas não o arquivo inteiro, alguém pode me ajudar ..
sed -i -n '/.*_job: .*/{h}; /job_type.*/{H;x;s/\n/ /;p}'
Entrada.
update_job: YUHG_GHT_FGT_BOX
job_type: box
condition : s(XXXYYUYBJHBJb) &
svcdesk_desc: XXXXXX
insert_job: TYYUH_JYUH_BOX
job_type: cmd
condition : s(XXXYYUYBJHBJb) &
svcdesk_desc: XXX
insert_job: TYU_hju_poonj
job_type: CMD
condition : s(XXXYYUYBJHBJb) &
svcdesk_desc: XXX
insert_job: YU_opoj_BOX job_type: BOX
condition : s(XXXYYUYBJHBJb) &
svcdesk_desc: XX
insert_job: YU_opoj_BOX
job_type: BOX
condition : s(XXXYYUYBJHBJb) &
svcdesk_desc: XX
O/P esperado:-
update_job: YUHG_GHT_FGT_BOX job_type: box
condition : s(XXXYYUYBJHBJb) &
svcdesk_desc: XXXXXX
insert_job: TYYUH_JYUH_BOX job_type: cmd
condition : s(XXXYYUYBJHBJb) &
svcdesk_desc: XXX
insert_job: TYU_hju_poonj job_type: CMD
condition : s(XXXYYUYBJHBJb) &
svcdesk_desc: XXX
insert_job: YU_opoj_BOX job_type: BOX
condition : s(XXXYYUYBJHBJb) &
svcdesk_desc: XX
insert_job: YU_opoj_BOX job_type: BOX
condition : s(XXXYYUYBJHBJb) &
svcdesk_desc: XX
Você pode fazer:
se uma linha estiver contida
_job
, leia aN
linha ext e anexe ao espaço do padrão e remova o\n
caractere ewline incorporado (que usamos a nova linha real aqui, dividindo a linha com barra invertida\
e depois nova linha) se essa linha estiver começando comjob_type
.Usando perl para ler o arquivo no modo de parágrafo (
-00
) e o modificador regex do perl/m
para que possamos processar strings de várias linhas com um único regex:Isso substitui efetivamente a nova linha entre uma linha que contém
_job:
e qualquer linha imediatamente seguinte que comece comjob_type
, por um único espaço. As linhas que não correspondem a esse critério exato são deixadas como estão, inalteradas.Ele usa dois grupos de captura,
(_job:.*?)
e(job_type:)
, e o quantificador regex não ganancioso do perl?
para que o primeiro grupo de captura corresponda apenas de_job:
a tudo antes da primeira nova linha depois_job:
(ou seja, o restante da linha).BTW, se houver alguma chance de haver espaço em branco à direita no final da
_job:
linha e/ou qualquer espaço em branco antes dajobtype:
linha, altere\n
o regex para\s*\n\s*
Assim como com
sed
, você pode usar a-i
opção se quiser modificar o arquivo original em vez de imprimir em stdout.Simples em Perl:
-p
lê a entrada linha por linha e imprime cada linha após o processamento-i
altera o arquivo no lugartr/\n/ /
substitui a nova linha por um espaçoif /_job/
só executa o comando se a condição for verdadeira, ou seja, se a linha contiver_job
.Dada a entrada/saída de amostra postada, parece que você deseja fazer o seguinte, usando qualquer awk em qualquer shell em cada caixa Unix:
Com
ed
:O roteiro de edição:
Isso aplica um comando de substituição (
s
) e um comando de junção (j
) a todas as linhas no buffer de edição que começam com a string literaljob_type:
. A substituição insere um único espaço no início da linha e o comando join une a linha afetada com a linha anterior no buffer.Os comandos trailing
p
eQ
imprimem o buffer modificado no terminal e encerram. Você pode alterá-los parawq
gravar o resultado de volta no arquivo original se desejar fazer uma edição no local.