Existem quatro maneiras de incluir a cotação simples de que você precisa.
Não é possível escapar de uma string de aspas simples dentro de uma string de aspas simples. No entanto, pode-se terminar a string entre aspas, inserir um aspas simples com escape e, em seguida, iniciar uma nova string entre aspas simples.
Assim, para colocar uma aspa simples no meio de 'ab'
, use: 'a'\''b'
. Ou, usando o comando sed que você precisa:
$ sed -r 's/,([^ ),]+)/,'\'''\''/g; s/,,/,'\'\'',/g' file
INSERT INTO radcheck(id, username, attribute, op, value) VALUES (,'','00:23:32:c2:a9:e8','Auth-Type',':=','Accept');
A segunda maneira é usar uma string com aspas duplas, em cujo caso a aspa simples pode ser inserida facilmente:
$ sed -r "s/,([^ ),]+)/,''/g; s/,,/,'',/g" file
INSERT INTO radcheck(id, username, attribute, op, value) VALUES (,'','00:23:32:c2:a9:e8','Auth-Type',':=','Accept');
Esse problema com cadeias de caracteres com aspas duplas é que o shell faz o processamento nelas. Aqui, no entanto, não há caracteres ativos no shell, por isso é fácil.
O terceiro método é usar um escape hexadecimal como PM2Ring demonstra.
A quarta maneira, sugerida nos comentários de Jonathan Leffler, é colocar os comandos sed
em um arquivo separado:
$ cat script.sed
s/,([^ ),]+)/,''/g
s/,,/,'',/g
$ sed -rf script.sed file
INSERT INTO radcheck(id, username, attribute, op, value) VALUES (,'','00:23:32:c2:a9:e8','Auth-Type',':=','Accept');
Desta forma, tem a grande vantagem de que sed
lê os comandos diretamente, sem qualquer interferência do shell. Conseqüentemente, isso evita completamente a necessidade de escapar de caracteres ativos em shell e permite que os comandos sejam inseridos na sintaxe sed
pura.
Como a solução sed
funciona
O truque é colocar aspas simples em torno das sequências separadas por vírgulas que você deseja, mas não em torno das outras. Com base no único exemplo que você deu, aqui está uma abordagem:
-
s/,([^ ),]+)/,''/g
Isso procura por um ou mais caracteres não espaciais, sem vírgula e sem parentesco, que seguem uma vírgula. Esses caracteres são colocados entre aspas simples.
-
s/,,/,'',/g
Isso procura por vírgulas consecutivas e coloca duaspas simples entre elas.
OSX e outras plataformas BSD
Para evitar barras invertidas extras, as expressões sed
acima usam expressões regulares estendidas. Com o GNU, elas são chamadas como -r
, mas, com o BSD, elas são invocadas com -E
. Além disso, alguns não-GNU sed
não aceitam vários comandos separados por ponto e vírgula. Assim, no OSX, tente:
sed -E -e "s/,([^ ),]+)/,''/g" -e "s/,,/,'',/g" file
Adendo: combinando um endereço MAC
Nos comentários, temos a seguinte entrada:
$ cat file3
INSERT INTO radcheck(username, attribute, op, value) VALUES (00:23:32:c2:a9:e8,'Auth-Type',':=','Accept');
E queremos colocar aspas simples em torno do endereço MAC que segue os parênteses abertos. Para fazer isso:
$ sed -r "s/\(([[:xdigit:]:]+)/(''/" file3
INSERT INTO radcheck(username, attribute, op, value) VALUES ('00:23:32:c2:a9:e8','Auth-Type',':=','Accept');
Em qualquer localidade, [:xdigit:]
corresponderá a qualquer dígito hexadecimal. Assim, ([[:xdigit:]:]+)
corresponderá a um endereço MAC (dígito hexadecimal ou dois pontos).