extrai valores de um campo em uma linha e acrescenta esses valores a esta última linha

0

Eu tenho linhas como essa em um arquivo

x;x;x;x;x;x;cmd="lbk_addcolumn TABLE_NAME_1 COLUMN_X";x;x;x;x

x;x;x;x;x;x;cmd="lbk_dropcolumn TABLE_NAME_2 COLUMN_Y";x;x;x;x

Desejo substituir o campo "cmd" no arquivo por algo assim:

x;x;x;x;x;x;cmd="ColumnAdded TABLE_NAME_1 COLUMN_X || lbk_addcolumn TABLE_NAME_1 COLUMN_X";x;x;x;x

x;x;x;x;x;x;cmd="ColumnDropped TABLE_NAME_2 COLUMN_Y || lbk_dropcolumn TABLE_NAME_2 COLUMN_Y ";x;x;x;x

Como posso fazer isso?

    
por MarioRlo 02.02.2017 / 17:17

3 respostas

0

Você pode tentar este script Bash:

while read ln; do
    out='sed 's/\([^"]*\)"\([^"]*\)\(.*\)/" || /' <<< "$ln"'
    out='sed -e 's/lbk_addcolumn/ColumnAdded/' -e 's/lbk_dropcolumn/ColumnDropped/' <<< "$out"'
    echo "$out"
done < input.txt

onde input.txt contém suas linhas

    
por 02.02.2017 / 17:54
0
sed -r -e "s/(lbk_addcolumn.*)(\[.*\])\s*(\[.*\])/ColumnAdded   ||   /g" \ 
-e "s/(lbk_dropcolumn.*)(\[.*\])\s*(\[.*\])/ColumnDropped   ||   /g" input.txt

onde input.txt é seu conteúdo

    
por 02.02.2017 / 18:00
0

Em vez de padrões de regex do feio, se todas as linhas tiverem o mesmo formato fixo como suas duas linhas (6 * x; cmd="..."; 4 * x), abaixo os comandos alternativos farão o trabalho no arquivo , sem exigir um loop de leitura de arquivo.

O ponto-chave (se o formato for constante em todas as linhas) é o uso do " como delimitador, cortando as linhas em 3 campos separados.

$ sed 's/lbk_addcolumn/ColumnAdd/;s/lbk_dropcolumn/ColumnDrop/' <(awk -F'"' '{if (($0=="")) print $0;else print $1"\""$2" || "$2"\""$3}' file.txt)

Ou:

$ a=$(awk -F'"' '{if (($0=="")) print $0;else print $1"\""$2" || "$2"\""$3}' file.txt)
$ sed 's/lbk_addcolumn/ColumnAdd/;s/lbk_dropcolumn/ColumnDrop/' <<<"$a"

o awk divide cada linha do arquivo com " como delimitador.
se $0="" for uma linha em branco, imprima a linha em branco e continue mais imprima todos os campos de linha na ordem necessária.

Finalmente, o sed substitui o primeiro texto encontrado lbk_addcolumn por ColumnAdd .

Teste:

$ cat e.txt
x;x;x;x;x;x;cmd="lbk_addcolumn TABLE_NAME_1 COLUMN_X";x;x;x;x

x;x;x;x;x;x;cmd="lbk_dropcolumn TABLE_NAME_2 COLUMN_Y";x;x;x;x

# sed 's/lbk_addcolumn/ColumnAdd/;s/lbk_dropcolumn/ColumnDrop/' <(awk -F'"' '{if (($0=="")) print $0;else print $1"\""$2" || "$2"\""$3}' e.txt)
x;x;x;x;x;x;cmd="ColumnAdd TABLE_NAME_1 COLUMN_X || lbk_addcolumn TABLE_NAME_1 COLUMN_X";x;x;x;x

x;x;x;x;x;x;cmd="ColumnDrop TABLE_NAME_2 COLUMN_Y || lbk_dropcolumn TABLE_NAME_2 COLUMN_Y";x;x;x;x

O mesmo resultado pode ser alcançado mesmo com o awk e o uso da função gsub awk:

$ awk -F'"' '{if ($0=="") print $0;else {a=$2;gsub("lbk_addcolumn","ColumnAdd",$2);gsub("lbk_dropcolumn","ColumnDrop",$2);print $1"\""$2" || "a"\""$3;}}' e.txt
x;x;x;x;x;x;cmd="ColumnAdd TABLE_NAME_1 COLUMN_X || lbk_addcolumn TABLE_NAME_1 COLUMN_X";x;x;x;x

x;x;x;x;x;x;cmd="ColumnDrop TABLE_NAME_2 COLUMN_Y || lbk_dropcolumn TABLE_NAME_2 COLUMN_Y";x;x;x;x

awk better presentation:

    $ awk -F'"' '{
      if ($0=="") print $0;
      else {
        a=$2;
        gsub("lbk_addcolumn","ColumnAdd",$2);
        gsub("lbk_dropcolumn","ColumnDrop",$2);
        print $1"\""$2" || "a"\""$3;
           }
                 }' e.txt
    
por 03.02.2017 / 01:32