Existe uma maneira de dizer sed
para substituir o padrão em cada segunda ocorrência? Ou pelo menos em cada segunda linha? (Claro que é possível com um script, mas eu estava me perguntando se sed
posso fazê-lo).
Editar
eu encontrei
sed -e "s/pattern/replacement/g;n"
Mas substituiu toda primeira ocorrência, não a segunda.
Exemplo
Arquivo de entrada:
I have a pattern in each line
Also the second line has the pattern
Another pattern here
And -- you guess it -- a pattern
Saída desejada:
I have a pattern in each line
Also the second line has the replacement
Another pattern here
And -- you guess it -- a replacement
sed -e 'n;s/2004-2009/6e législature/g'
que resolveu meu problema.Substituirá a segunda ocorrência em todas as linhas que possuem o padrão.
se você tem GNU
sed
:A partir da linha um
1
, a linha após ser adicionada ao espaço do padrãoN
, os
comando substituirá a segunda ocorrência do padrão. depoissed
moverá duas linhas para baixo~2
e repetirá.fonte
code
(sed '1 ~ 2s / padrão / substituição /') #A simples interpretação:
Na primeira linha que contém pelo menos uma ocorrência de PATTERN, você deseja ignorá-la e imprimir a linha como está. Na segunda linha que contém pelo menos uma ocorrência de PATTERN, você deseja substituir a primeira instância de PATTERN por REPLACEMENT. Na terceira linha que contém pelo menos uma ocorrência de PATTERN, você deseja imprimir a linha como está. Na quarta linha que contém pelo menos uma ocorrência de PATTERN, você deseja substituir a primeira instância de PATTERN por REPLACEMENT. E assim por diante. As linhas que não correspondem ao PADRÃO devem ser impressas sem alterações.
Isso pode ser feito facilmente com o Sed, da seguinte maneira:
Ou, com menos espaço em branco e um rótulo mais curto:
Edição: Acabei de reler a pergunta e vi a interpretação mais difícil:
Substitua a segunda ocorrência de PATTERN no documento inteiro por REPLACEMENT, se ela ocorre na mesma linha da primeira ocorrência ou não. Deixe a primeira e a terceira ocorrências inalteradas. Etc.
Acredito que isso possa ser feito com o Sed também, embora seja MUITO mais complicado e acredito que depende da expressão regular a ser usada. Vou tentar resolver alguma coisa e publicá-la, mas deixarei que esta resposta permaneça com a versão simples acima, por enquanto.
fonte
t
est por umq
uit e{ sed '...'; cat; } <input
Você estava muito perto, apenas pule a primeira linha:
Por que deveria
awk
ser a melhor ferramenta neste caso?fonte
Um padrão de símbolo dentro de uma linha: sed 's / (a [^ a] *) a / \ 1c / g'
Cada segundo padrão (apenas uma correspondência de padrão por linha pode aparecer. Se duas ou mais correspondências por uma linha aparecerem, apenas a segunda será substituída)
fonte