Regex '/ pattern / g' e ed ': g / pattern /': o que veio primeiro, e por que 'g'?

7

A opção g (por exemplo, s/pattern/replacement/g ) para muitas ferramentas que usam correspondência de padrão no estilo regex e o comando :g em ed , ex , vi e vim têm um parecido uso e significado: corresponde à regex dada "globalmente", ou seja, não pare após a primeira partida.

Eu tenho uma pergunta dupla sobre isso:

  • Qual foi o primeiro, o comando :g ou o sinalizador g de correspondência de padrões e em qual ferramenta? Parece que a maioria das ferramentas (como sed ) que usam o sinal g em sua correspondência de padrões está realmente apenas emulando direta ou indiretamente ed . Por exemplo, na era pós-Perl, a maioria das ferramentas que usam regex permite o g flag porque Perl, e Perl, parece, porque ed - > sed - > %código%. Então, eu não ficaria surpreso se a resposta fosse "eles foram introduzidos simultaneamente na ferramenta original Perl , e não têm precedentes históricos além disso".
  • Por que isso é chamado de ed opção (ou comando)? Não há realmente nada "global" sobre isso; o comando global usa um intervalo de linhas como qualquer outro comando :g , e o sinalizador ed não amplia o alcance da pesquisa de forma alguma (permite apenas vários acessos). Eu suponho que não consigo pensar em um nome melhor , mas o escolhido parece estranho para mim, então estou pensando se há alguma razão para isso que eu não esteja vendo.
por Kyle Strand 18.02.2014 / 20:26

2 respostas

4

O vi é inspirado em ex , ex é inspirado em ed , ed é inspirado por qed

O QED foi invadido por Ken Thompson no final dos anos 60 para o "Compatible Time-". Sharing System "(uma versão anterior do Berkeley Timesharing System foi criada por Butler Lampson, L. Peter Deutsch e Dana Angluin) - em suma, Thompson acrescentou regex em qed (ele fez muito mais do que isso, mas está fora do escopo de esta resposta - Bell Labs tem mais sobre a história da QED )

Um comando no qed era o comando "G" ou "Global". Ele permitia que você operasse em todas as linhas do arquivo de uma só vez (a versão anterior do qed era orientada por caracteres em vez de orientada por linhas).

O grep é nomeado para um dos usos desse comando G / re / P ( G global, re expressão regular, P print) em qed esse comando foi usado como G/bash/P para imprimir todas as linhas contendo a palavra bash - isso foi mais tarde incluído no ed, então retirado do ed e transformado em uma função autônoma (de acordo com Doug McIlroy, ele pediu a Ken para fazer isso por ele e Ken o deixou em sua mesa na manhã seguinte) )

    
por 19.02.2014 / 22:56
3

Eu acredito que ambos vieram ao mesmo tempo como parte de ed , ou possivelmente QED . Eles são fundamentais para o uso de ed . Se alguma vez houve uma versão que não tivesse os dois, não consigo imaginar como funcionaria.

g// e //g são duas coisas completamente diferentes. E há várias coisas acontecendo aqui.

  • // é para procurar a próxima linha no arquivo que contém o padrão, ele pode retornar apenas uma única linha (observe que 1,$/./ é inválido).
  • g// é para procurar um padrão em várias linhas, por padrão, todos ou um intervalo especificado. Pode retornar várias linhas.
  • //g alone não tem sentido e não é um comando válido em ed (embora alguns outros mecanismos o aceitem, é funcionalmente o mesmo que // ).
  • s// é para substituir a primeira instância de um padrão na linha atual (ou especificada).
  • s//g é para substituir todas as instâncias de um padrão nas linhas atuais (ou especificadas).

Espero que isso, pelo menos, elimine a confusão. Mas acho que o ponto principal da resposta à sua pergunta é que essas são duas coisas diferentes. Cada um é usado por um motivo diferente e significa coisas diferentes.

    
por 18.02.2014 / 23:57