substitui do início da linha por 1 de múltiplos padrões até o final de outra linha com o 2º padrão

1

Eu tenho um arquivo como este:

data data data
$globaltext blah gibberjabber
somemorestuff etc
);
data data data
$otherjunk yada gibberish
etc etc
more etc
);

Meu resultado desejado é este arquivo:

data data data
/*$globaltext blah gibberjabber
somemorestuff etc
);*/
data data data
/*$otherjunk yada gibberish
etc etc
more etc
);*/

Eu sei como fazer isso usando um loop for com sed , mas gostaria de um comando sed de 1 linha para conseguir isso, algo como:

sed '/blah\|yada/s/^\(\$.*)\;\)/\/\*\*\//' filename

A correspondência de padrões no início limita a busca a 1 linha, então obviamente o comando acima falha. Mas o conceito é o que eu quero:

  1. Corresponder a qualquer lista de padrões ( blah ou yada ),
  2. adicione o texto desejado ( /* ) ao início da linha correspondente,
  3. E adicione outro texto desejado ( */ ) ao final da próxima linha que corresponda a um padrão diferente ( ); ), em que o # de linhas entre as duas correspondências varie (nem sempre seja duas linhas separadas)

É possível ou devo usar loop ou um método melhor?

Pedindo principalmente para aprender, já que sou novo em scripts de shell.

    
por mowglie 04.01.2016 / 07:31

1 resposta

2

sed   -e's|^\$|/*&|;t$' -eb -e:$      -e'### handle top end of loop' \
      -e's|);$|&*/|;t'  -en -eb$      -e'### handle the bottom end'
data data data
/*$globaltext blah gibberjabber
somemorestuff etc
);*/
data data data
/*$otherjunk yada gibberish
etc etc
more etc
);*/

As duas tentativas s/// ubstitutions são t ested. No primeiro caso, se a substituição for bem-sucedida, sed não terminará com b ranching do script e se ramificará em vez do rótulo :$ . Quando não é bem-sucedido, ele não salta o comando b ranch e, assim, apenas ramifica e insere automaticamente as entradas até que ^\$ seja correspondido.

Depois de combinar, ele entra em um loop fechado começando em :$ e terminando em b$ e, portanto, não tenta a primeira s/// ubstitution novamente até que o loop seja concluído. Neste final do ciclo sed t ests o caso de correspondência );$ para uma s/// ubstitution bem-sucedida e, uma vez bem-sucedido, ramifica-se do script para reiniciar o ciclo a partir do topo novamente com a próxima linha de entrada, se houver. Até que ele faça a cópia automática recursiva, em seguida, sobreponha o espaço de padrão com a linha de entrada n ext para cada iteração - e, assim, nunca precisará de buffers desnecessários.

    
por 04.01.2016 / 22:12