Faça
sed ': loop; s/\(\[[^][]*\)|\([^][]*\]\)/,/; t loop' input_file
O que se passa?
-
: loop
é um rótulo para looping; Eu vou usá-lo em um momento. -
s/\(\[[^][]*\)|\([^][]*\]\)/,/
substitui um|
que aparece entre[
e]
com uma vírgula. Dividido:s/ \( \[ [^][] * \) | \( [^][] * \] \) / , /
-
\(
…\)
delimita uma pesquisa & substitua o grupo. Dado um[
…]
com um|
entre eles, isso corresponde a[
a (mas sem incluir) o (ultimo)|
como um grupo, e tudo após o|
up até (incluindo) o]
como um segundo grupo. -
\[
corresponde a um literal[
. -
[^][]
corresponde a qualquer caractere diferente de[
ou]
. Ele divide como[ ^ ][ ]
, ou seja, uma instância de[^characters_to_not_match]
-
*
- zero ou mais caracteres que não sejam[
ou]
. -
\)
- fim do grupo; discutido acima. -
|
é um literal|
(aquele que queremos substituir). - A segunda metade da expressão regular
é quase o mesmo que o primeiro semestre:
corresponde a um grupo que consiste em zero ou mais caracteres diferentes de
[
ou]
, seguido por um]
. - Em seguida, substitua tudo isso pelo primeiro grupo, uma vírgula e o segundo grupo.
Como tudo na string correspondente está em um dos grupos,
com exceção do
|
, isso substitui funcionalmente o\
pelo,
.
-
-
t loop
- teste / transferência. Se o comandos
encontrou uma correspondência e fez uma substituição, volte para o marcador e tente novamente (porque o comandos
substitui apenas um|
de cada vez). Se não encontrou uma correspondência, termine o script de comando e vá para a próxima linha.