Eu o mantenho simples:
sed '/command/s/[^;]*;keyword/INSERTED_STRING;&/'
para inserir dois campos antes da palavra-chave. A solução geral seria
sed "/command/s/\([^;]*;\)\{$N\}keyword/INSERTED_STRING;&/"
mas observe que o N
tem uma rede de 1 em comparação com a sua pergunta: Aqui, N=2
significa ter dois campos entre a inserção e o keyword
.
Explicação: /command/
seleciona apenas linhas com command
, portanto outras linhas permanecem inalteradas. ([^;]*;\)
corresponde a um campo (uma sequência de semicolons) incluindo o ponto e vírgula a seguir. Seguindo-o com \{$N\}
, o padrão corresponde a $N
fields. O seguinte keyword
conclui isso para corresponder aos campos keyword
e $N
antes. O padrão de substituição consiste na string inserida e &
, que é substituído por tudo que foi correspondido (então, no final, não foi uma substituição, mas uma inserção).
Em curto e melhor legível com expressões regulares estendidas:
sed -E "/command/s/([^;]*;){$N}keyword/INSERTED_STRING;&/"