Estou executando este comando em um shell bash no Ubuntu 12.04.1 LTS. Eu estou tentando remover os personagens [
e de ]
uma só vez, ou seja, sem ter que ir para a segunda vez.
Eu sei que colchetes têm um significado especial em uma regex, por isso estou escapando deles acrescentando uma barra invertida. O resultado que eu esperava era apenas a corda, 123
mas os colchetes permanecem e eu adoraria saber o porquê!
~$ echo '[123]' | sed 's/[\[\]]//'
[123]
str='[123]'; str1=${str/\[/}; str2=${str1/\]}; echo $str2
Respostas:
Isso é fácil, se você seguir atentamente o manual : todos os membros de uma classe de personagem perdem um significado especial (com algumas exceções). E] perde seu significado especial se for colocado em primeiro lugar na lista. Experimentar:
Isto diz:
]
e[
//
,g
.Novamente,
]
deve ser o primeiro da classe sempre que incluído.fonte
Não sei por que isso não funciona, mas o seguinte:
ou isto:
Você também pode tentar uma abordagem diferente e corresponder à string dentro dos colchetes (supondo que a string possa corresponder facilmente e não seja definida pelos colchetes):
Estou tendo os mesmos problemas com o seu regex original usando,
grep
então desconfio que isso não seja apenas umased
coisa.Estranhamente, eles produzem resultados diferentes, mas um deles corresponde ao que você deseja:
Aplicando isso ao seu original
sed
(e adicionando o/g
modificador para remover os dois colchetes):fonte
tr
:echo '[123]' | tr -d '[]'
- evita confusões de expressões regulares sobre como escapar.tr
pudesse traduzir apenas um caractere no máximo por vez, mas eu estava errado. Obrigado!Para remover tudo antes e depois dos colchetes:
Se seus dados forem assim, sempre significa começar e terminar com colchetes:
fonte
Se você possui uma string mais complexa como 'abcdef [123] ghijk', também pode usar o comando bash interno 'cut' para extrair texto apenas entre colchetes:
fonte
Você pode escapar do suporte de abertura usando
\[
. Para o suporte de fechamento, use[]]
.fonte