substituir a enésima ocorrência da sequência em cada linha de um arquivo de texto

15

Eu tenho arquivos de texto grandes com seqüências delimitadas por espaço (2-5). As cadeias podem conter "'" ou "-". Gostaria de substituir, digamos, o segundo espaço por um cano.

Qual o melhor caminho a percorrer?

Usando sed eu estava pensando sobre isso:

sed -r 's/(^[a-z'-]+ [a-z'-]+\b) /\1|/' filename.txt

Alguma outra / melhor / mais simples idéias?

dnkb
fonte

Respostas:

22

Você pode adicionar um número no final do comando substituto. Por exemplo, o seguinte substituirá a segunda ocorrência de oldcom a sequência newem cada linha de file:

sed 's/old/new/2' file

Portanto, em vez da sua solução proposta, você pode usar:

sed 's/ /|/2'

Para mais informações, consulte, por exemplo, este tutorial sed .

mrucci
fonte
2
No sedarquivo info: "Nota: o padrão POSIX não especifica o que deve acontecer quando você mistura as g' and NUMBER modifiers, and currently there is no widely agreed upon meaning across implementações sed '. Para GNU` sed', a interação é definida como: ignorar correspondências antes de NUMBERth e, em seguida, corresponder e substituir todas as corresponde a partir de NUMBERth. "
Pausado até novo aviso.
Arquivos de informação ... Eu os odeio. Enfim, eu removi a parte ambígua. Bom comentário, +1.
Mrucci
11
Obrigado, Mrucci e Dennis. Eu pensei que deveria haver algo simples lá fora.
Dnkb 22/05
Parece que todos os problemas que tenho com a manipulação de texto, consigo resolver sed. Não tenho certeza se devo agradecer por me tornar sedainda mais útil, mas farei de qualquer maneira. ;)
Jamie
1

Você experimentou sua versão? Funcionou? Porque acho que é basicamente uma boa ideia. Eu faria um pouco diferente, no entanto:

sed -re 's/^([^ ]+ +[^ ]+) /\1|/'

Isso aceitará qualquer caractere em uma palavra que não seja espaço e aceitará mais de um espaço entre as duas primeiras palavras.

petersohn
fonte