Estendendo a resposta de Steve:
awk '/HBASE_MASTER_OPTS/&&/ -XX:[+]UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=2M/{x++;print;next}/HBASE_MASTER_OPTS/&&x<2{gsub(/"$/," -XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=2M\"");x++}1' ams-hbase-env-template.txt
Update: Aqui está uma versão mais amigável para manutenção, onde cada string só ocorre uma vez.
awk 'BEGIN{p="-XX:+UseGCLogFileRotation -XX:NumberOfGCLogFiles=5 -XX:GCLogFileSize=2M"}{m=0}/HBASE_MASTER_OPTS/{m=1;++x}m&&index($0,p){print;next}m&&x<=2{gsub(/"$/," " p "\"")}1' ams-hbase-env-template.txt
E alguma explicação:
- Na primeira versão da correspondência de padrão,
[+]é usado para o caractere literal +, porque senão+seria interpretado como caractere especial.
Os pontos restantes são sobre a segunda versão:
- Na cláusula
BEGIN, a sequência de propriedadespé definida. Todas as cláusulas a seguir se aplicam às linhas da entrada. -
{m=0}: Esta cláusula não tem condição, o que significa que se aplica a todas as linhas, de modo que para cada linha, primeirom(para correspondência) será definida como zero. -
/HBASE_MASTER_OPTS/{m=1;++x}: se uma linha corresponder à stringHBASE_MASTER_OPTS,mserá definido e nosso contador de linha será incrementado. -
m&&index($0,p){print;next}: esta cláusula verifica se, além de uma correspondência indicada porm, também a cadeia de propriedades está contida na linha de entrada. Nesse caso,indexretornará um valor diferente de zero. Nesse caso, imprimimos a linha como está (não adicionando as propriedades novamente) e comnextignoramos as cláusulas restantes e começamos a processar a próxima linha. Note que as cláusulas a seguir foram originalmente fornecidas por Steve e apenas adaptadas por mim: -
m&&x<=2{gsub(/"$/," " p "\"")}: se chegarmos a este ponto e tivermos uma linha correspondente e nosso contador não tiver excedido 2, modificamos$0(a linha de entrada) ao prefixar o terminal"com um espaço em branco e nossa cadeia de propriedades. Além disso, nenhuma saída é produzida, o que será feito pela próxima cláusula. -
1: esta é uma condição (sempre verdadeira) sem uma ação, o que significa que a ação é padronizada para imprimir a linha de entrada.