AskOverflow.Dev

AskOverflow.Dev Logo AskOverflow.Dev Logo

AskOverflow.Dev Navigation

  • Início
  • system&network
  • Ubuntu
  • Unix
  • DBA
  • Computer
  • Coding
  • LangChain

Mobile menu

Close
  • Início
  • system&network
    • Recentes
    • Highest score
    • tags
  • Ubuntu
    • Recentes
    • Highest score
    • tags
  • Unix
    • Recentes
    • tags
  • DBA
    • Recentes
    • tags
  • Computer
    • Recentes
    • tags
  • Coding
    • Recentes
    • tags
Início / unix / Perguntas / 689248
Accepted
Renga
Renga
Asked: 2022-02-05 02:07:41 +0800 CST2022-02-05 02:07:41 +0800 CST 2022-02-05 02:07:41 +0800 CST

Mova a linha correspondente para a próxima linha imediata até o final da linha correspondente

  • 772

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
text-processing sed
  • 5 5 respostas
  • 77 Views

5 respostas

  • Voted
  1. Best Answer
    αғsнιη
    2022-02-05T02:42:37+08:002022-02-05T02:42:37+08:00

    Você pode fazer:

    sed '/_job/{N;/\
    job_type/s/\
    / /;}' infile
    

    se uma linha estiver contida _job, leia a Nlinha ext e anexe ao espaço do padrão e remova o \ncaractere 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 com job_type.

    • 2
  2. cas
    2022-02-05T20:02:01+08:002022-02-05T20:02:01+08:00

    Usando perl para ler o arquivo no modo de parágrafo ( -00) e o modificador regex do perl /mpara que possamos processar strings de várias linhas com um único regex:

    $ perl -00 -p -e 's/(_job:.*?)\n(job_type:)/$1 $2/mg' input.txt
    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
    

    Isso substitui efetivamente a nova linha entre uma linha que contém _job:e qualquer linha imediatamente seguinte que comece com job_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 da jobtype:linha, altere \no regex para\s*\n\s*

    Assim como com sed, você pode usar a -iopção se quiser modificar o arquivo original em vez de imprimir em stdout.

    • 1
  3. choroba
    2022-02-05T02:19:59+08:002022-02-05T02:19:59+08:00

    Simples em Perl:

    perl -pi -e 'tr/\n/ / if /_job/' -- file
    
    • -plê a entrada linha por linha e imprime cada linha após o processamento
    • -ialtera o arquivo no lugar
    • tr/\n/ /substitui a nova linha por um espaço
    • if /_job/só executa o comando se a condição for verdadeira, ou seja, se a linha contiver _job.
    • 0
  4. Ed Morton
    2022-02-06T06:09:09+08:002022-02-06T06:09:09+08:00

    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:

    $ awk '/_job/ && !/job_type/{j=$0 OFS; next} {print j $0; j=""}' file
    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
    
    • 0
  5. they
    2022-02-06T07:54:26+08:002022-02-06T07:54:26+08:00

    Com ed:

    printf '%s\n' 'g/^job_type:/ s/^/ /\' '-1,.j' ',p' 'Q' | ed -s file
    

    O roteiro de edição:

    g/^job_type:/ s/^/ /\
    -1,.j
    ,p
    Q
    

    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 literal job_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 pe Qimprimem o buffer modificado no terminal e encerram. Você pode alterá-los para wqgravar o resultado de volta no arquivo original se desejar fazer uma edição no local.

    • 0

relate perguntas

  • Como remover uma única linha entre duas linhas

  • Reorganize as letras e compare duas palavras

  • Subtraindo a mesma coluna entre duas linhas no awk

  • Embaralhamento de arquivo de várias linhas

  • como posso alterar o caso do caractere (de baixo para cima e vice-versa)? ao mesmo tempo [duplicado]

Sidebar

Stats

  • Perguntas 205573
  • respostas 270741
  • best respostas 135370
  • utilizador 68524
  • Highest score
  • respostas
  • Marko Smith

    Possível firmware ausente /lib/firmware/i915/* para o módulo i915

    • 3 respostas
  • Marko Smith

    Falha ao buscar o repositório de backports jessie

    • 4 respostas
  • Marko Smith

    Como exportar uma chave privada GPG e uma chave pública para um arquivo

    • 4 respostas
  • Marko Smith

    Como podemos executar um comando armazenado em uma variável?

    • 5 respostas
  • Marko Smith

    Como configurar o systemd-resolved e o systemd-networkd para usar o servidor DNS local para resolver domínios locais e o servidor DNS remoto para domínios remotos?

    • 3 respostas
  • Marko Smith

    apt-get update error no Kali Linux após a atualização do dist [duplicado]

    • 2 respostas
  • Marko Smith

    Como ver as últimas linhas x do log de serviço systemctl

    • 5 respostas
  • Marko Smith

    Nano - pule para o final do arquivo

    • 8 respostas
  • Marko Smith

    erro grub: você precisa carregar o kernel primeiro

    • 4 respostas
  • Marko Smith

    Como baixar o pacote não instalá-lo com o comando apt-get?

    • 7 respostas
  • Martin Hope
    user12345 Falha ao buscar o repositório de backports jessie 2019-03-27 04:39:28 +0800 CST
  • Martin Hope
    Carl Por que a maioria dos exemplos do systemd contém WantedBy=multi-user.target? 2019-03-15 11:49:25 +0800 CST
  • Martin Hope
    rocky Como exportar uma chave privada GPG e uma chave pública para um arquivo 2018-11-16 05:36:15 +0800 CST
  • Martin Hope
    Evan Carroll status systemctl mostra: "Estado: degradado" 2018-06-03 18:48:17 +0800 CST
  • Martin Hope
    Tim Como podemos executar um comando armazenado em uma variável? 2018-05-21 04:46:29 +0800 CST
  • Martin Hope
    Ankur S Por que /dev/null é um arquivo? Por que sua função não é implementada como um programa simples? 2018-04-17 07:28:04 +0800 CST
  • Martin Hope
    user3191334 Como ver as últimas linhas x do log de serviço systemctl 2018-02-07 00:14:16 +0800 CST
  • Martin Hope
    Marko Pacak Nano - pule para o final do arquivo 2018-02-01 01:53:03 +0800 CST
  • Martin Hope
    Kidburla Por que verdadeiro e falso são tão grandes? 2018-01-26 12:14:47 +0800 CST
  • Martin Hope
    Christos Baziotis Substitua a string em um arquivo de texto enorme (70 GB), uma linha 2017-12-30 06:58:33 +0800 CST

Hot tag

linux bash debian shell-script text-processing ubuntu centos shell awk ssh

Explore

  • Início
  • Perguntas
    • Recentes
    • Highest score
  • tag
  • help

Footer

AskOverflow.Dev

About Us

  • About Us
  • Contact Us

Legal Stuff

  • Privacy Policy

Language

  • Pt
  • Server
  • Unix

© 2023 AskOverflow.DEV All Rights Reserve