
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 'BBB
para 'BBB'
e pensei em usar sed
e 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, AAA
eu 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, sed
os comandos anexados não estavam funcionando corretamente e, para verificar isso, tentei o sed
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
estamos tratando colchetes esquerdos e colchetes de maneira diferente. Consegui escapar sem escapar do [
, enquanto sed
me 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 sed
ou 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']