colchetes esquerdo e direito tratados diferentemente por sed / bash

2

Eu 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]#

Eu quero isso como uma lista para usar no meu script python, então estou tentando alterar AAA' para 'AAA' e 'BBB para 'BBB' e pensei em usar sed e substituir [ com [' e ] com '] .

Para confirmar, tentei isso:

[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 '] . Então, para AAA eu só preciso trocar substituir os colchetes direitos e a aspa simples no sed com um colchete esquerdo e tentei fazer isso:

[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. Eu pensei por algum motivo acrescentando sed comandos não estão funcionando corretamente e para verificar isso eu tentei o sed no colchete 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 sed está tratando a esquerda e os colchetes de maneira diferente. Consegui escapar sem escapar do [ , enquanto sed se recusa a trabalhar com ] sem o caractere de escape. Eu finalmente consegui o que eu quero com a adição de caracteres de escape para o 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]#

Eu estou no processo de escrever um script python + shell que manipulará arquivos com numerosas instâncias de ambos os colchetes. Minha pergunta é se os colchetes direito e esquerdo são tratados de maneira diferente por sed ou bash .

a versão sed é a versão 4.2.1 do GNU sed.

PS: Eu decidi usar caracteres de escape com os dois colchetes para jogar em segurança, mas quero ter certeza absoluta de que ele não quebrará o script se eu não usar o caractere de escape (por razões de legibilidade) em lugares onde Eu estarei trabalhando apenas com colchete direito ]

    
por Sree 16.11.2014 / 10:03

2 respostas

5

[ apresenta uma classe de caracteres e ] a fecha.

Se o sed encontrar somente ] (ou seja, o comando closing), tudo estará OK, o sed assume que este não é um comando especial.

Usar somente [ (sem um fechamento ] ) confunde sed , por isso deve ser escapado.

Em uma nota lateral, não há necessidade de

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

Gerenciei sua alteração com

sed -e "s/]/']/" -e "s/\[/['/" 
    
por 16.11.2014 / 11:53
1

Archemar explicou por que isso falhou em [ , eis outra maneira de fazer esse substituto em particular:

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

Ou usando & , que significa "o que quer que você tenha correspondido":

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