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
,m
será 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,index
retornará um valor diferente de zero. Nesse caso, imprimimos a linha como está (não adicionando as propriedades novamente) e comnext
ignoramos 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.