Colchetes esquerdo e direito tratados de forma diferente pelo sed/bash

Colchetes esquerdo e direito tratados de forma diferente pelo sed/bash

Tenho um arquivo com o seguinte conteúdo:

[root@server list]# cat filenames.txt
[AAA','ACMEDEMO2','ACMEDEMO3','ACMEDEMO4','RENTCOGH','TESTENT','DORASINE','LOKAWINK','BBB]
[root@qa4app01 list]#

Quero isso como uma lista para usar em meu script python, então estou tentando mudar AAA'para 'AAA'e 'BBBpara 'BBB'e pensei em usar sede substituir [por ['e ]por '].

Para confirmar, tentei isto:

[root@server list]# cat filenames.txt | sed "s/]/']/g"
[AAA','ACMEDEMO2','ACMEDEMO3','ACMEDEMO4','MENSCOGH','TESTENT','DORASINE','LOKAWINK','BBB']
[root@server list]#

Funcionou e consegui substituir o ]por um arquivo ']. Então, AAAeu só preciso substituir os colchetes direitos e as aspas simples no sed por um colchete esquerdo e tentei o seguinte:

[root@server list]# cat filenames.txt | sed -e "s/]/']/g" -e "s/[/['/g"
sed: -e expression #2, char 8: unterminated `s' command
[root@server list]#

OK. Achei que, por algum motivo, sedos comandos anexados não estavam funcionando corretamente e, para verificar isso, tentei o sedcolchete esquerdo separadamente:

[root@server list]# cat filenames.txt | sed  "s/[/['/g"
sed: -e expression #1, char 8: unterminated `s' command
[root@server list]#

Estranho. Parece que sedestamos tratando colchetes esquerdos e colchetes de maneira diferente. Consegui escapar sem escapar do [, enquanto sedme recuso a trabalhar ]sem o caractere de escape. Finalmente consegui o que queria adicionando caracteres de escape ao colchete esquerdo, como abaixo:

[root@server list]# cat filenames.txt | sed -e "s/]/']/g" -e "s/\[/\['/g" ['AAA','ACMEDEMO2','ACMEDEMO3','ACMEDEMO4','MENSCOGH','TESTENT','DORASINE','LOKAWINK','BBB'] [root@server list]#

Estou escrevendo um script python + shell que manipulará arquivos com inúmeras instâncias de colchetes. Minha pergunta é se os colchetes direito e esquerdo são tratados de maneira diferente por sedou bash.

A versão sed é GNU sed versão 4.2.1.

PS: Decidi usar caracteres de escape com ambos os colchetes para garantir a segurança, mas quero ter certeza absoluta de que não quebrará o script se eu não usar o caractere de escape (por motivos de legibilidade) em locais onde estarei trabalhando apenas com colchete direito]

Responder1

[apresenta umclasse de personageme ]fecha.

Se o sed vir apenas ](ou seja, o comando de fechamento), tudo bem, o sed assume que este não é um comando especial.

Usar apenas [(sem fechamento ]) confunde sed, portanto deve ser escapado.

Por outro lado, não há necessidade de

  • g(global) sinalizador (apenas uma substituição por linha)
  • escapar [em substituição.

Eu gerenciei sua mudança com

sed -e "s/]/']/" -e "s/\[/['/" 

Responder2

Archemar explicou por que isso falhou [. Aqui está outra maneira de fazer essa substituição específica:

$ sed "s/^./['/;s/.$/']/" file
['AAA','ACMEDEMO2','ACMEDEMO3','ACMEDEMO4','RENTCOGH','TESTENT','DORASINE','LOKAWINK','BBB']

Ou, usando &o que significa "tudo o que você acabou de combinar":

$ sed "s/^./&'/;s/.$/'&/" file
['AAA','ACMEDEMO2','ACMEDEMO3','ACMEDEMO4','RENTCOGH','TESTENT','DORASINE','LOKAWINK','BBB']

informação relacionada