Como escrever um sed
(ou awk
, ou ambos) que levará o seguinte:
echo '1 aa 2 2 3 bb 5 bb 2 5' | sed/awk ...
E substituir apenas a n-ésima ocorrência de uma string? Por exemplo, a 3ª ocorrência de 2
ou a segunda ocorrência de bb
?
Portanto, a saÃda esperada seria (ao substituir a 2ª ocorrência de bb
por , replaced
por exemplo):
1 aa 2 2 3 bb 5 replaced 2 5
A string de entrada, a string de substituição e n
pode ser qualquer entrada arbitrária.
Usando
sed
para alterar a segunda ocorrência debb
ou para alterar a terceira ocorrência de 2
Para alterar a enésima ocorrência dentro de uma linha,
sed
tem sintaxe para issos/pattern/replacement/3
como já mostrado por @HatLess .Para alterar a n- ésima ocorrência em toda a entrada, você pode usar
perl
com:Com
awk
você poderia fazer:Resultado:
Nota: Acima, assume-se que existe apenas um único caractere como separador de campo (padrão: Espaço ou Tab), caso contrário, o separador de campo consecutivo será compactado em um ou você pode forçar o awk a corresponder em cada separador de campo separadamente (portanto, o FS deve ser forçado como modo regex):
Nota: mude
\t
para o caractere de espaço se o separador de campo for o caractere de espaço.Para alterar a enésima ocorrência em toda a entrada (ainda que eu assumi que o separador de campo seja o caractere Tab):
Podemos fazer as duas coisas
sed
em um único comando:Este comando substituirá a 3ª ocorrência de
2
withkop
e a 2ª ocorrência debb
withpp
.