Remove a última vírgula dentro de um padrão

1

Se eu tiver o seguinte texto dentro de um arquivo (somefile.txt):

CREATE TABLE "table_name" (
   "id" int(11) unsigned NOT NULL,
   "some_field" varchar(10),
);

CREATE TABLE "another_table" (
   "id" int(11) unsigned NOT NULL,
   "some_other_field" varchar(10),
);

Eu quero remover a última vírgula à direita de cada declaração, para que ela se torne:

CREATE TABLE "table_name" (
   "id" int(11) unsigned NOT NULL,
   "some_field" varchar(10)
);

CREATE TABLE "another_table" (
   "id" int(11) unsigned NOT NULL,
   "some_other_field" varchar(10)
);

Eu usei a expressão regular \,$\n\) , mas não consigo fazer isso funcionar com sed , o que gera:

sed: -e expression #1, char 23: Unmatched ) or \)

quando eu uso:

sed -i -e 's/\,$\n\)/)/g' somefile.txt
    
por Amo 07.09.2015 / 12:02

2 respostas

4

Se a sintaxe do arquivo estiver em todos os lugares como nos exemplos, você pode usar

sed -i -n -e '1h;1!H;${g;s/\,\n);/\n);/g;p}' somefile.txt

Explicação:

1h           # copy first line the hold buffer
1!H          # not first line -> append to the hold buffer
${           # execute at the end
   g          # copy hold buffer back to pattern buffer
   s/ ... /   # multiline replacement in pattern buffer
   p          # print pattern buffer
}

(veja também link )

Desta forma, todo o arquivo é lido, mantido e modificado na memória, se o arquivo for muito grande para isso, uma maneira diferente precisa ser escolhida.

    
por 07.09.2015 / 12:23
1
sed 'N;s/,\n)/\n)/;P;D' file

ou para o GNU sed

sed -z 's/,\n)/\n)/g' file

ou awk

awk '
    f{
        if(!/);/)
            print ","
        else 
            print ""
        f=0
    }
    /,$/{
        sub(",$", "")
        printf $0
        f=1
        next
    }
    1' file
    
por 07.09.2015 / 14:32