inserir nova linha quando negativo + padrão positivo é encontrado usando sed

1

Tenho vários arquivos txt que precisam ser limpos e analisados adequadamente. Eu preciso quebrar linhas quando o padrão "SP". é encontrado, mas não quando o padrão "ASSERT. SP." seja encontrado.

Amostra de conteúdo:

    SP. 247 for specific issues no really solved
    ASSERT. SP. 4532 no so valuable it depends on primary conditions
    At first location in London City SP. 3901 must be applied
    ASSERT. SP. 23245 must be followed by procedure SP. 8236 in all steps
    Special tools are needed for SP. 9734 to be accomplished

Resultado desejado:

        SP. 247 for specific issues no really solved
        ASSERT. SP. 4532 no so valuable it depends on primary conditions
        At first location in London City 
        SP. 3901 must be applied
        ASSERT. SP. 23245 must be followed by procedure 
        SP. 8236 in all steps
        Special tools are needed for 
        SP. 9734 to be accomplished

Minha primeira abordagem é usar regex para descobrir se "SP". é não precedido por um ponto e depois substituir por "newline + SP ". mas sem sucesso até agora.

sed -r 's/([^\.] )(SP\. )/\nSP\. /g' 
    
por jomaweb 23.11.2016 / 17:23

3 respostas

1

Precisa de um pequeno ajuste na solução sed postada no OP

sed -r 's/([^.] )(SP\. )/\n/g'

O problema com s/([^\.] )(SP\. )/\nSP\. /g é que ele descarta ([^\.] ) . Também . não precisa ter o escape dentro de [] , assim como na seção de substituição

    
por 23.11.2016 / 18:01
1

Geralmente, as mesmas tarefas podem ser resolvidas via substituição de parte não alterada pelo símbolo raro e depois devolvê-lo

sed '
    s/\(^\s*\|ASSERT\. \)SP\./\a/g
    s/SP\./\n&/g
    s/\a/SP./g
    '
    
por 23.11.2016 / 18:26
0

Eu faria isso

sed -r '
    # for lines without "ASSERT.", add a newline before "SP."
    # unless it is only preceded by whitespace
    /ASSERT\./! s/^(.*[^[:blank:]].*)(SP\.)/\n/

    # for lines containing "ASSERT.", add a newline before the last "SP."
    s/^(.*ASSERT\..*SP\..*)(SP\..*)/\n/
' file
    
por 23.11.2016 / 18:57