encontrar um campo e movê-lo para antes do final da linha

1

Eu tenho a seguinte linha e quero encontrar o campo contendo "ABCD" e movê-lo antes do último campo na linha.

string1;string2;xxxABCDxxx;string3;string4;string5;string6

Saída

string1;string2;string3;string4;string5;xxxABCDxxx;string6
    
por Tony 02.07.2015 / 20:43

2 respostas

3
sed 's/\([^;]*ABCD[^;]*;\)\(.*;\)//' <in >out

Isso provavelmente deve ser feito.

Ele só funcionará para a primeira ocorrência de um campo ABCD . Se houver mais de um na linha, todo o resto será ignorado.

Para trocar o último ; ponto-e-vírgula por uma barra, apenas altere um pouco:

sed 's|\([^;]*ABCD[^;]*\);\(.*;\)|/|' <in >out
    
por 02.07.2015 / 20:51
3

Se você não está preso ao sed:

awk -v pattern="ABCD" '
    BEGIN { FS = OFS = ";" }
    {
        # find the first field containing the string
        for (i=1; i<NF; i++) if ($i ~ pattern) break

        # alter the last field to the desired contents
        $NF = $i "/" $NF

        # shift each subsequent field one place
        for (;i<NF; i++) $i = $(i+1)

        # reset the number of fields
        NF--

        # and output the new line
        print
    }
' filename
    
por 02.07.2015 / 21:16

Tags