Estou tentando fazer uma substituição do sed que estou fazendo atualmente com dois comandos. Não consigo descobrir como combinar os dois comandos para que substitua as palavras corretamente de uma só vez.
Meu papel aqui é anexar sc_admin
a cada lugar que tem as palavras admin
lá.
Abaixo estão todas as combinações de palavras que consigo pensar:
access = read : [ admin ], write : [ admin, power ]
access = read : [ security_pan_power ], write : [ security_pan_power ]
access = read : [ * ], write : [ admin, wis_master, wis_read_only, wis_web ]
access = read : [ admin ]
access = read : [ admin, somerole ], write : [ admin, power ]
Então, atualmente estou usando 2 comandos sed para fazer substituições
sed -e '/\bsc_admin\b/b' -e '/admin/ s/ *]/, sc_admin ]/' infile
substitui a palavra admin na parte de leitura corretamente, mas não substitui a palavra admin na parte de gravação.
por exemplo
access = read : [ admin, sc_admin ], write : [ admin, power ]
access = read : [ security_pan_power ], write : [ security_pan_power ]
access = read : [ *, sc_admin ], write : [ admin, wis_master, wis_read_only, wis_web ]
access = read : [ admin, sc_admin ]
access = read : [ admin, somerole, sc_admin ], write : [ admin, power ]
access = read : [ defadmin, somerole, sc_admin ], write : [ admin, power ]
enquanto
sed -e '/\bsc_admin\b/b' -e '/admin/ s/ *] *$/, sc_admin ]/'
O comando anexa a palavra admin na parte de gravação corretamente enquanto não faz nada na parte de leitura.
access = read : [ admin ], write : [ admin, power, sc_admin ]
access = read : [ security_pan_power ], write : [ security_pan_power ]
access = read : [ * ], write : [ admin, wis_master, wis_read_only, wis_web, sc_admin ]
access = read : [ admin, sc_admin ]
access = read : [ admin, somerole ], write : [ admin, power, sc_admin ]
access = read : [ defadmin, somerole ], write : [ admin, power ]
Portanto, atualmente estou executando um comando e, em seguida, estou executando o segundo comando para corrigir os arquivos. Existe uma maneira infalível de combinar os comandos para obter a saída adequada?
Esta é a saída real que eu desejo:
access = read : [ admin, sc_admin ], write : [ admin, power, sc_admin ]
access = read : [ security_pan_power ], write : [ security_pan_power ]
access = read : [ * ], write : [ admin, wis_master, wis_read_only, wis_web, sc_admin ]
access = read : [ admin, sc_admin ]
access = read : [ admin, somerole, sc_admin ], write : [ admin, power, sc_admin ]
Você pode fazer o seguinte com
sed
:\(\[ admin[^]]*\)
capture a string '[ admin<todos os caracteres que não sejam ] e um espaço final>. Para isso colocamos a captura entre\(...\)
, e usamos[^]]*
para selecionar caracteres que não são(^
) ']'.\1, sc_admin
substitua pelo grupo capturado (\1
) e acrescente ', sc_admin'.