Substituir Números Arbitrários do Word [closed]

3

Usando sed , quero substituir os padrões da seguinte maneira:

---          >>>         +++
--+--        >>>         ++-++
--+-+--      >>>         ++-+-++
--+-+-+--    >>>         ++-+-+-++

...

--(+-)^n-    >>>         ++(-+)^n+

A string, na qual estou operando, é uma lista arbitrária de + e -s.

--+++-+--+--++-+--++--+-+--++--+-++-+-

Eu tentei isso, mas não funciona.

sed '/--\<+-\>*-/{s/+/A/g;s/-/+/g;s/A/-/g}'

Para o exemplo acima, esperaria a seguinte saída:

--+++-+--+--++-+--++--+-+--++--+-++-+-     (input)
--+++-+++-++++-+--++++-+-++++--+-++-+-     (output)
       !!!!!        !!!!!!!

(as marcas de exclamação indicam as regiões alteradas.)

    
por PhilippVerpoort 28.10.2015 / 19:02

1 resposta

0

Você tenta modificar apenas a parte correspondente à regex no seu endereço, mas, depois que o endereço coincide, a substituição afeta a linha inteira. O truque é ter apenas o que você deseja alterar no espaço de padrão ao aplicar a transformação. Este comando faz isso:

sed '/--\(+-\)*-/{:a;h;s/.*\(--\(+-\)*-\).*//;y/+-/-+/;G;s/\(.*\)\n\(.*\)--\(+-\)*-\(.*\)//;/--\(+-\)*-/ba}' <<< '--+++-+--+--++-+--++--+-+--++--+-++-+-'

Eu pouco é mais fácil de ler:

/--\(+-\)*-/ {                  # Match a line containing the pattern
    :start                      # Label to branch back to
    h                           # Copy pattern space to hold space
    s/.*\(--\(+-\)*-\).*//    # Remove everything but pattern
    y/+-/-+/                    # Swap + and -
    G                           # Append hold space to pattern space
    s/\(.*\)\n\(.*\)--\(+-\)*-\(.*\)//  # Rearrange pattern space
    /--\(+-\)*-/b start         # If there are more occurrences, branch to start
}

Observe que isso provavelmente não funcionará com os comentários, y parece ter um problema com eles.

Teste com uma string de exemplo:

$ sed -f sedscr <<< '--+++-+--+--++-+--++--+-+--++--+-++-+-'
--+++-+++-++++-+--++++-+-++++--+-++-+-

Dois pontos para mencionar sobre o comando sed na pergunta:

  • \< e \> correspondem a limites de palavras, mas você só quer agrupar: \(\)
  • Se você tiver um mapeamento direto de caracteres para alterar, poderá usar o comando de transformação y em vez de várias substituições
por 17.01.2016 / 06:38

Tags